1,参数展开
空变量
${parameter:-word}
如果parameter没有设置或者为空,该展开会给出一个值word。如果parameter不空,该展开会给出parameter的值。注意:不会把word的值赋给parameter。
${parameter:=word}
展开的规则跟${parameter:-word}一样,如果parameter没有设置或者为空,该展开会给出一个值word。如果parameter不空,该展开会给出parameter的值。注意:该展开执行之后,会把word值赋给parameter。
${parameter:?word}
如果parameter没有设置或为空,该展开会导致脚本错误exit,word会显示在标准错误输出,如果parameter不空,扩展会给出parameter的值。
${parameter:+word}
如果parameter没有设置或为空,该展开什么也不做。如果parameter非空,该扩展会输出word值,但是parameter不会改变。
字符串操作
${#parameter} 返回字符串parameter长度
${parameter:offset}
${parameter:offset:length}
返回字符串parameter的一部分。如果offset是负值,则从尾部开始计数,负值前面必须有空格,以与${parameter:-word}区分。
${parameter#pattern}
${parameter##pattern}
删除parameter中pattern匹配到的前导部分,pattern是通配符模式,跟pathname expansion类似,#删除最短的匹配,##删除最长的匹配。
[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ echo ${foo#*.}
txt.zip
[me@linuxbox ~]$ echo ${foo##*.}
zip
${parameter%pattern}
${parameter%%pattern}
跟${parameter#pattern} ${parameter##pattern} 类似,只不过是从尾部开始删除。
${parameter/pattern/string}
${parameter//pattern/string}
${parameter/#pattern/string}
${parameter/%pattern/string}
扩展在parameter上执行search-and-replace操作,匹配pattern,替换成string。正常模式下,值替换第一次匹配到的,//模式下,替换掉所有匹配到的,/#模式,要求必须在开头才能匹配上,/%模式,要求在结尾才能匹配。所以模式下,/string都可以忽略,执行删除。
大小写转换
declare -u variable // 把variable的值都转换成大写
declare -l variable // 把variable的值都转换成小写
2,数学运算
$((expression))
基数
number 10进制
0number 8进制
0xnumber 16进制
base#number
shell算术运算仅仅作用于整数,所以整数的除法结果还是整数。
比特运算
~ 取反
<< 左移运算
>> 右移运算
& 与
| 或
^ 异或
逻辑运算
用于(( )) 里整数比较
<= >= < > == != && || expr1?expr2:expr3
bc的用法
bc 可以从文件输入。例如
# foo.bc
2+ 2
bc -q foo.bc
直接执行bc命令, 可以进入交互界面。
还可以从标准输入 bc < foo.bc
还可以使用here string,例如:bc <<< "2+2"
在脚本中,还可以使用here doc的方式。
bc <<- EOF
scale = 10
i = $interest / 12
p = $principal
n = $months
a = p * ((i * ((1 + i) ^ n)) / (((1 + i) ^ n) - 1))
print a, "\n"
EOF
scale 可以修改bc的精度。