现在的位置: 首页 > 综合 > 正文

Shell学习

2018年02月20日 ⁄ 综合 ⁄ 共 6885字 ⁄ 字号 评论关闭

1 Shell中的变量赋值

转自:http://czmmiao.diandian.com/post/2011-02-20/18865603

#!/bin/bash
#Filename:prameter_parctise2
#Datetime:2010_12_24 09:24
#Discription:Practise of evaluating parameters
# 等号赋值
a=879
echo "The value of \"a\" is $a." 
# 使用'let'赋值
let a=16+5
echo "The value of \"a\" is now $a."
echo 'The value of \'a\' is now $a.' 
# 在'for'循环中赋值(事实上, 这是一种伪赋值):
echo -n "Values of \"a\" in the loop are: " 
#--------------------------------------------
for a in 7 8 9 11
       do
   echo -n "$a "
       done
echo 
#--------------------------------------------
#使用'read'命令进行赋值(这也是一种赋值的类型):
echo -n "Enter \"a:\" "
read a
echo "The value of \"a\" is now $a." 
#--------------------------------------------
b=$a
echo $b 
# 现在让我们来点小变化(命令替换).
c=`echo Hello!` # 把'echo'命令的结果传给变量'a'
echo $c 
c=`ls -l` # 把'ls -l'的结果赋值给'a'
echo $c      #然而, 如果没有引号的话将会删除ls结果中多余的tab和换行符.
echo "$c"   #如果加上引号的话, 那么就会保留ls结果中的空白符.
#命令替换也可以通过( )实现
R=$(cat /etc/redhat-release)
arch=$(uname -m)
echo $R; echo $arch
exit 0 
进行浮点运算 
#!/bin/bash
echo -n "Inpute a:"
read a
echo -n "Input b:"
read b 
#计算a,b的乘积,包括浮点数 
c=` "scale=3;$a*$b" | bc`
echo "c=$c"
exit 0
#!/bin/bash
#Filename:parameter_replacement.sh 
#Datetime:2010_12_24 17:09 
#Discription:Replace the parameter
myfruit="pear" 
fruit=${myfruit:-apple}                                                #对于“:-":如果myfruit变量被定义过且不为空,则不传入"apple"。否则传入 
echo When myfruit is set ,fruit is :$fruit                        apple,该传是暂时的,非永久性
unset myfruit 
fruit=${myfruit:-apple} 
echo When myfruit is unset,fruit is :$fruit
unset var_x
echo When var_x is unset,var_x is :$var_x              #对于":=",如果var_x变量未被定义过或为空,则将var_x赋值为"shala"。否则 
echo Now var_x is: ${var_x:=shala}                             将var_x变量将保留他原本的值。该赋值为永久性的,非暂时性的 
echo Now var_x is: ${var_x:=banana}
unset var_x 
echo ${var_x:+"aoyun beijing"}                                #对于":+",如果var_x变量未被定义或为空,则不传入"aoyun beijing"。如果 
var_x="beijing 2008"                                                     var_x被定义过, 则传入"aoyun beijing",该传是暂时的,非永久性 
echo ${var_x:+"aoyun beijing"} 
echo var_x is:$var_x  
exit 0 

2 Shell中截取字符串方法

转自:http://www.111cn.net/sys/linux/43822.htm

shell中截取字符串的方法有很多中,可以分为两大类。第一种获取特定的字符或字符串的左边或者右边的字字符串,java中实现需要先用indexOf来确定特定字符串的位置,然后再用substring来获取结果;第二种类似java中的substring
shell中截取字符串的方法有很多中,
${expression}一共有9种使用方法。
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word} 
上面4种可以用来进行缺省值的替换。
${#parameter}
上面这种可以获得字符串的长度。 
${parameter%word} 最小限度从后面截取word
${parameter%%word} 最大限度从后面截取word
${parameter#word} 最小限度从前面截取word
${parameter##word} 最大限度从前面截取word
上面4个就是用来截取字符串的方法了。
有了着四种用法就不必使用cut命令来截取字符串了

第一种又可以分为四种情况,下面一一介绍。
1、使用 # 号操作符。用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。用法为#*substr,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str#*//}
得到的结果为www.你的域名.com/cut-string.html,即删除从左边开始到第一个"//"及其左边所有字符2、使用 ## 号操作符。用途是从左边开始删除最后一次出现子字符串即其左边字符,保留右边字符。用法为##*substr,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str##*/}
得到的结果为cut-string.html,即删除最后出现的"/"及其左边所有字符3、使用 % 号操作符。用途是从右边开始删除第一次出现子字符串即其右边字符,保留左边字符。用法为%substr*,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%/*}
得到的结果为http://www.你的域名.com,即删除从右边开始到第一个"/"及其右边所有字符4、使用 %% 号操作符。用途是从右边开始删除最后一次出现子字符串即其右边字符,保留左边字符。用法为%%substr*,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%%/*}
得到的结果为http://www.你的域名.com,即删除从右边开始到最后一个"/"及其右边所有字符第二种也分为四种,分别介绍如下:
1、从左边第几个字符开始以及字符的个数,用法为:start:len,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:2、从左边第几个字符开始一直到结束,用法为:start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:7}
其中的 7 表示左边第8个字符开始
结果是:www.你的域名.com/cut-string.html3、从右边第几个字符开始以及字符的个数,用法:0-start:len,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-15:10}
其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:cut-string3、从右边第几个字符开始一直到结束,用法:0-start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-4}
其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:html注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
网上其它参考内容

一、Linux shell 截取字符变量的前8位,有方法如下:
1.expr substr “$a” 1 8
2.echo $a|awk ‘{print substr(,1,8)}’
3.echo $a|cut -c1-8
4.echo $
5.expr $a : ‘(.\).*’
6.echo $a|dd bs=1 count=8 2>/dev/null
二、按指定的字符串截取
1、第一种方法:
${varible##*string} 从左向右截取最后一个string后的字符串
${varible#*string}从左向右截取第一个string后的字符串
${varible%%string*}从右向左截取最后一个string后的字符串
${varible%string*}从右向左截取第一个string后的字符串
“*”只是一个通配符可以不要
例子:
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg
2、第二种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。
可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga
这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。
三、按照指定要求分割:
比如获取后缀名

ls -al | cut -d “.” -f2

3 数组

转自:http://blog.csdn.net/shaobingj126/article/details/7395570

Shell 数组元素个数${#array[@]} 数组的所有元素${array[*]} 字符串长度${#str}

1、获取数组元素的个数:

        array=(bill   chen  bai   hu);

        num=${#array[@]}                          //获取数组元素的个数。

       遍历数组就变成非常简单的事情:

       for ((i=0;i<num;i++))

       {   echo   $array[i];  }

       获取数组某一个单元的长度就变成了:

       ${#array[i]}

2、获取数组的所有元素:

      ${array[*]}

     遍历数组就编程了非常简单的事情:

     for var in  ${array[*]}

     do

                  echo $var;

     done

     获取数组某一个单元的长度就变成了:

     ${#var}

3、获取字符串的长度:

       str="hello"

       len=${#str}

转自:http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html

1.数组定义

 

[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ echo $a
1

 

一对括号表示是数组,数组元素用“空格”符号分割开。

 

2.数组读取与赋值

  • 得到长度

[chengmo@centos5 ~]$ echo ${#a[@]}
5

用${#数组名[@或*]} 可以得到数组长度

  • 读取

[chengmo@centos5 ~]$ echo ${a[2]} 
3

[chengmo@centos5 ~]$ echo ${a[*]} 
1 2 3 4 5   

用${数组名[下标]} 下标是从0开始  下标是:*或者@ 得到整个数组内容

  • 赋值:

[chengmo@centos5 ~]$ a[1]=100

[chengmo@centos5 ~]$ echo ${a[*]} 
1 100 3 4 5

 

[chengmo@centos5 ~]$ a[5]=100     
[chengmo@centos5 ~]$ echo ${a[*]}

1 100 3 4 5 100

直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素

  • 删除:

[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ unset a
[chengmo@centos5 ~]$ echo ${a[*]}

[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ unset a[1]   
[chengmo@centos5 ~]$ echo ${a[*]} 
1 3 4 5
[chengmo@centos5 ~]$ echo ${#a[*]}
4

直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据。

 

 

3.特殊使用

  • 分片:

[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ echo ${a[@]:0:3}
1 2 3
[chengmo@centos5 ~]$ echo ${a[@]:1:4}
2 3 4 5

[chengmo@centos5 ~]$ c=(${a[@]:1:4})
[chengmo@centos5 ~]$ echo ${#c[@]}
4
[chengmo@centos5 ~]$ echo ${c[*]} 
2 3 4 5

直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。

  • 替换:

[chengmo@centos5 ~]$ a=(1 2 3 4 5)    
[chengmo@centos5 ~]$ echo ${a[@]/3/100}
1 2 100 4 5
[chengmo@centos5 ~]$ echo ${a[@]}
1 2 3 4 5
[chengmo@centos5 ~]$ a=(${a[@]/3/100}) 
[chengmo@centos5 ~]$ echo ${a[@]}     
1 2 100 4 5

调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。

4 for循环

for((i=1;i<10;i=i+2));do echo $i;done    

5 字符串拆分数组

转自:http://blog.csdn.net/zhuoxiong/article/details/8673018

shell编程中,经常需要将由特定分割符分割的字符串分割成数组,多数情况下我们首先会想到使用awk
但是实际上用shell自带的分割数组功能会更方便。假如
a=”one,two,three,four”

要将$a分割开,可以这样:
OLD_IFS=”$IFS”
IFS=”,”
arr=($a)
IFS=”$OLD_IFS”
for s in ${arr[@]}
do
echo “$s”
done

上述代码会输出
one
two
three
four

arr=($a)用于将字符串$a分割到数组$arr ${arr[0]} ${arr[1]} … 分别存储分割后的数组第1 2 … 项 ,${arr[@]}存储整个数组。变量$IFS存储着分隔符,这里我们将其设为逗号 “,” OLD_IFS用于备份默认的分隔符,使用完后将之恢复默认。

对文件中的字符串切割放到数组中

7481|1|1359475743|1014|1|14.223.145.61:1609
7482|1|1359475752|1014|3|14.223.145.61:1609
7483|1|1359475754|3544|1|121.61.222.187:2971
7484|1|1359475758|11541|3|183.187.51.156:2582

filename='aa.log'   #文件路径
OLD_IFS="$IFS"
IFS="|"
i=0
if [ -f ${filename} ];then
   while read line
   do
     arr=($line)
     echo ${arr[0]}_${arr[1]}_${arr[2]}_${arr[3]}_${arr[4]}_${arr[5]}_${i}
     i=$((i+1))
   done < ${filename}
fi

抱歉!评论已关闭.