• 变量替换的高级形式

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命令 算术表达式中不能有空格,且结果不会做替换


$(())还支持逻辑运算,但只能进行整数元算,小数部分会被忽略