expr支持的运算表达式比较好理解,而对其关键字选项需要加深一点理解。现记录如下。
match
match 字符串 表达式
例如:$ expr match “abcdefg” “abcd”
4
或者
$ expr “abcdefg” : “abcd”
4
(用”abcd”去从头开始匹配”abcdefg”,成功匹配到了4个字符所以返回’4’;如果没有匹配上则会返回’0’)substr
substr 字符串 偏移量 长度
例如:$ expr substr “abcdefg” 2 4
bcde
(即从”abcdefg”的第2个字符取出4个字符(”abcdefg”中的字符从1开始计数))index
index 字符串 字符
例如:$ expr index “abcdefg” “f”
6
(即返回”f”的索引)
再试一个
$ expr index “abcdefgf” “f”
6
(所以只返回第一个匹配的索引)length
length 字符串
例如:$ expr length “abcdefg”
7
(返回字符串长度)+
+ TOKEN
例如:
$ expr + match
match
(就是把所有字符串原样返回,对特殊字符、符号,甚至像match这样的关键字都不转义)
shel脚本很可能会用到expr表达式的返回值,而expr的帮助信息中有如下提示:
若表达式的值既不是空也不是 0,退出状态值为 0;若表达式的值为空或为 0,
退出状态值为 1。如果表达式的句法无效,则会在出错时返回退出状态值 3。
- ##实例: ##
校验密码:要求输入包含字符和数字和点(.)和下划线(_),且不能以’_’开头
正则表达式:expr 'a_bc12' : '^[^_][a-z0-9._]*$'
以上表达式计算匹配到的字符串长度,再和输入的密码长度对比,计算输入的密码长度:# len_passwd=${#PASSWD}
,如果两个长度一致,说明匹配,否则不匹配