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 “(())” 双括号运算符使用
算术扩展
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 花括号与圆括弧中的指令组