变量替换的高级形式
getopts命令
语法:getopts optstring name [args]
optstring包含希望被识别并且处理的选项字符,如果某个字符的后面有一个冒号(:),说明这个选项是要指定参数的,当命令行使用这样的选项时,选项字符与参数之间应该有个空格,冒号和问号不能作为选项字符。脚本每次执行getopts命令时,他都会把命令行中的下一个选项放到变量name中,如果这个选项需要参数,他会把相应的 参数放到变量OPTARG中,然后把下一次执行getopts命令时要处理的选项的index放到变量OPTIND中,这样在getopts处理完所有选项后,最后的操作对象的index就会保存到变量OPTIND中。每一次成功地处理完一个选项以后,都会设置退出状态为0,而在处理完所有选项以后,由于没有可以处理的选项,getopts会以大于0的状态退出,从而可以作为结束循环的判断。
当用户执行脚本时没有提供需要的参数,则会把一个问号(?)赋给OPTION,同时打印诊断信息。问号(?)在Shell中是有特殊含义的,所以case中需要转义\?。
${var:-value} | 如果变量var没有被定义或为空,就是用默认值来代替变量var的值,但是不会改变var的值 |
${var:+value} | 如果变量var不为空,就是用默认值value来代替var的值,但是不会改变var的值 |
${var:=value} | 如果变量var没有被定义或为空,就把value赋给它 |
${var:?msg} | 如果变量var的值为空,那么打印msg到标准错误输出并退出脚本 |
文件名替换
Shell支持以下几种通配符
* | 匹配0个或多个任意的字符 |
? | 匹配一个任意字符 |
[] | 匹配指定字符范围内中的任意一个字符,前面添加^或!来表示不包含这个范围的字符 |
注意,*和?只能匹配可见文件,要匹配隐藏文件得手动添加原点(.)
命令替换
语法:
$(commands)
`command`
都可以嵌套,但`commands \`commands\``需要转义反引号。$()要简洁,因为不用转义特殊字符。
commands可以用分号(;)分割的多个命令,也可以是管道连接的多个命令。
算术运算替换
内建的算术运算表达式$(()) 不能在变量前加$
expr命令 $(expr $DAY / 7) 变量、运算符周围得有空格,
let命令 算术表达式中不能有空格,且结果不会做替换
$(())还支持逻辑运算,但只能进行整数元算,小数部分会被忽略
转载于:https://blog.51cto.com/qianyang/1618720