|
()
命令组.在括号中的命令列表, 将会作为一个子shell来运行.
在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的. 父进程, 也就是脚本本身, 将不能够读取在子进程中创建的变量, 也就是在子shell中创建的变量.
(cmd1;cmd2;cmd3)
初始化数组.
Array=(element1 element2 element3)
$(...)
相当于`...`命令,返回括号中命令执行的结果
let命令
(( ))
(( ... ))结构可以用来计算并测试算术表达式的结果. 退出状态将会与[ ... ]结构完全相反!还可应用到c风格的for,while循环语句,(( )) 中,所有的变量(加不加$无所谓)都是数值。
$((...))结构的表达式是C风格的表达式,其返回的结果是表达式值,其中变量引用可不用‘$’(当然也可以)
for((...;...;...))
do
cmd
done
while ((...))
do
cmd
done
比较操作符
<
小于
(("$a" < "$b"))
"$b"))
>=
大于等于
(("$a" >= "$b"))
(( 0 )) 大于0为真,小于0为假
echo "Exit status of \"(( 0 ))\" is $?." # 1
(( 1 ))
echo "Exit status of \"(( 1 ))\" is $?." # 0
(( 5 > 4 )) # 真
echo "Exit status of \"(( 5 > 4 ))\" is $?." # 0
(( 5 > 9 )) # 假
echo "Exit status of \"(( 5 > 9 ))\" is $?." # 1
(( 5 - 5 )) # 0
echo "Exit status of \"(( 5 - 5 ))\" is $?." # 1
(( 5 / 4 )) # 除法也可以.
echo "Exit status of \"(( 5 / 4 ))\" is $?." # 0
(( 1 / 2 )) # 除法的计算结果 < 1.
echo "Exit status of \"(( 1 / 2 ))\" is $?." # 截取之后的结果为 0.
# 1
(( 1 / 0 )) 2>/dev/null # 除数为0, 非法计算.
#
echo "Exit status of \"(( 1 / 0 ))\" is $?." # 1
for ((a=1; a combined_file
# 把file1, file2, file3连接在一起, 并且重定向到combined_file中.
cp file22.{txt,backup}
# 拷贝"file22.txt"到"file22.backup"中
在大括号中, 不允许有空白, 除非这个空白被引用或转义.
echo {file1,file2}\ :{\ A," B",' C'}
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
代码块
这个结构事实上创建了一个匿名函数(一个没有名字的函数). 然而, 与"标准"函数不同的是, 在其中声明的变量,对于脚本其他部分的代码来说还是可见的(除了用declare,typeset命令声明的变量)
()会开启一个新的子shell,{}不会开启一个新的子shell
(())常用于算术运算比较,[[]]常用于字符串的比较.
$()返回括号中命令执行的结果
$(())返回的结果是括号中表达式值
${ }参数替换与扩展
参数替换
${var}
${var}=$var
${var:-default} ${var-default}
如果var未set,那么就是用default.两者之间不同只有当var为空变量时,前者为default,后者为空.
${var:=default} ${var=default}
如果var未set,那么就设置default.两者之间不同只有当var为空变量时,前者设置为default,后者设置为空.
${var:+default} ${var+default}
如果var被set,就是用default.未set,就使用null字符串.两者之间不同只有当var为空变量时,前者为null字符串,后者为default.
上面三种参数替换中,第二种使用后变量的值被改变.
参数替换扩展
${#var} ${#array}
字符串长度或数组第一个元素的字符串长度
例外:
${#*}、${#@}指位置参数的个数.
${#array
- },$[#array[@]}指数组元素的个数
${var#pattern} ${var##pattern}
从var开头删除最近或最远匹配pattern的子串.
${var%pattern} ${var%%pattern}
从var结尾删除最近或最远匹配pattern的子串.
${var:pos}
变量var从位置pos开始扩展.
${var:pos:len}
从位置pos开始,并扩展len长度个字符
${var/pattern/replacement} ${var//pattern/replacement}
使用replacement来替换var中的第一个或所有pattern的匹配.
${var/#pattern/replacement}
如果var的前缀匹配到了pattern,那么就用replacement来替换pattern.
${var/%pattern/replacement}
如果var的后缀匹配到了pattern,那么就用replacement来替换pattern.
${!varprefix*} ${!varprefix@}
前边所有声明过的,以varprefix为前缀的变量名.
[[]]就是条件表达式,在bash中,字符串比较用 > < != == = 只是在[]中 < >需要转义;对于数值比较.用 -lt -le -eq -ge -gt 来比较,与[[]]中表达不太一样,在[ ] 中的 < > 需要用转义 \< \>,如果有多个表达式,在[[ ]] 中用 && || 来组合,而[] 中是用 -a -o 来组合
在redhat 6 中测试 []中不需要转义亦可以使用,
|
|
|