shell常用语法总结

1 变量小结

1.1 变量显示(2种方式):

echo $var

echo ${var}

1.2 变量赋值(等号两侧不能有空格,否则,会当成命令来解析):

var="aaaa"

如:> var = "aaa" 

-bash: var: command not found

常见用法:

var=$(uname -r) #不容易出错

var=`uname -r`

1.3  若该变量需要在其它子进程执行,则需要以export来使变量变成环境变量

export 变量

1.4 取消变量

unset 变量

 

2 算术表达(归纳为5种方法)

2.1 算术扩展(推荐)

例如R=$((1+1))

  详见:http://suo.iteye.com/admin/blogs/1118779 linux shell “(())” 双括号运算符使用

2.2 使用外部程序expr
例如R=`expr 1+1`
2.3 使用$[]
例如R=[1+1]
2.4 使用命令declare
例如declare -i R=1+1
2.5 使用命令let(已过时)
例如let R=1+1

算术扩展 

     expr命令可以处理一些简单的算术命令,但这个命令执行起来相当慢,因为它需要调用一个新的shell来处理expr命令。一种更新更好的办法是使用$((...))扩展计算表达式的值。

注意:$((...))与$(...)不同,两对圆括号用于算术替换,一对圆括号用于命令的执行和获取输出
a=1			#定义变量a
((a++))		#a=2,对两对圆括号内的变量做算术运算
a=$((2+2))	#a=4,对两对圆括号内的变量做算术运算,并将结果赋值给左边变量

(seq 1 10)	#启用子进程,执行圆括号内的命令
a=$(seq 1 10)	#启用子进程,执行圆括号内的命令,同时把命令执行结果赋值给左边变量

3 for循环(2种语法)

3.1 固定循环

 

for var in con1 con2 con3 ...
do
    program
done

  例如:

for i in {1..10} #不支持变量赋值,比如:for i in {$from..$to},会报integer expression expected

for i in $(seq 1 10) #支持变量赋值,比如:for i in $(seq $from $to)

for i in stringchar {1..10}

for i in *.txt #列表显示当前shell所在路径下的所有以txt字符结尾的文件

for i in ${arr[@]} #数组循环 for i in $* #参数数组循环

awk 'BEGIN{for(i=1; i<=10; i++) print i}'

 

3.2 数值处理

 

for ( ( 初始值; 限制值; 执行步长))
do
    program
done

  例如:

for((i=1;i<=10;i++)); do echo $(expr $i \* 4); done #乘号需要转义 for((i=1;i<=10;i++)); do echo $(( $i * 4)); done #乘号不需要转义

 

4 数组array

 

arr=(Jennifer Tonya Anna Sadie Molly Millie)	#数组初始化
${arr[@]} 		#所有元素(@或者*)
${#arr[@]} 		#数组个数(@或者*)
${arr} 			#引用元素(数组名方式)默认引用第一个元素
${arr[0]} 		#引用元素(数组下标方式)
${arr[@]:1:2} 	#引用元素(切片方式):获取一部分数组内容
${arr[@]:2} 	#引用元素(切片方式):从第二个元素开始
${arr[@]::2} 	#引用元素(切片方式):到第二个元素
 

5 花括号与圆括弧中的指令组

       在 shell 中可以将一组指令用放在花括号 { } 和圆括弧中 ( ) 中执行。
5.1 在花括号中的指令组在语法上被视为一条指令,当指令的结果通过管道符时,它们按照从左到右的顺序输出,形成一个输出流,例如:

 

{ echo "I am in `pwd` now"; date; ls -al ;} | write root

 这样就会将 { } 中的命令输出通过 write 命令一股脑的发给 root 然后自己退出。

 

使用花括号命令组时需要注意第一个命令和左括号间要有个空格,而最后的一个命令和右括号之间并不要求要有空格,但是要求有一个分号;各个命令之间用分号隔开。

5.2 命令组也可以放到圆括弧中,如:

 

(echo "I am in `pwd` now"; date; ls -al) |write root

 

如上,圆括弧没有花括号的那种要求,即第一个命令与左括弧之间不需要有空格,而右括弧和最后一个命令之间也不需要有分号。

 

总结:两种情况看似一样,但有着重要区别:

 

    ( ) 里的命令会在一个子shell进行执行。

    { } 里的命令在当前 shell 执行。

    可以通过 $BASH_SUBSHELL 这个环境变量验证。脚本如下:

 

echo "Subshell level OUTSIDE subshell = $BASH_SUBSHELL"
{	echo "Subshell level INSIDE subshell = $BASH_SUBSHELL"; }
(	echo "Subshell level INSIDE subshell = $BASH_SUBSHELL" )

 运行输出:

 

 ./testcon2.sh  
Subshell level OUTSIDE subshell = 0
Subshell level INSIDE subshell = 0
Subshell level INSIDE subshell = 1

   由输出可见,当执行到 ( ) 中的 echo 指令时,BASH_SUBSHELL 变量变为 1,说明它已经在第一层子 shell 里执行程序了。

 

 

 

参考资料:

http://www.groad.net/bbs/read.php?tid-3671.html   花括号与圆括弧中的指令组

 

你可能感兴趣的:(shell)