目录
内容来源:
GUN : Coreutils - GNU core utilities
busybox v1.36.1 : 【busybox记录】【shell指令】基于的Busybox的版本和下载方式-CSDN博客
【GUN】【expr】指令介绍
expr:计算表达式
expr 计算表达式并将结果写入标准输出。表达式的每个记号必须是一个单独的参数。
操作数可以是整数或字符串。整数由一个或多个十进制数字组成,可选的前导' - '。
expr 将出现在操作数位置的任何内容转换为整数或字符串,具体取决于对其应用的操作。
对于expr本身,字符串不需要加引号,尽管您可能需要加引号来保护对shell有特殊意义的字符,例如空格。
但是,无论是否引用,字符串操作数都不应该是圆括号或expr的任何操作符(如+),因此您不能仅仅通过向shell引用任意字符串$str来安全地将其传递给expr。
解决这个问题的一种方法是使用GNU扩展+(例如,+ "$str" = foo);一种更可移植的方法是使用" $str"并调整表达式的其余部分以考虑前导空格(例如," $str" = " foo")。
你不应该传递负整数或以' - '开头的字符串作为expr的第一个参数,因为它可能被误解为一个选项;这可以通过括号来避免。
此外,可移植脚本不应该使用恰好采用整数形式的字符串操作数;这可以通过插入前导空格来解决,如上所述。
操作符可以作为中缀符号或前缀关键字给出。括号可以用来按照通常的方式进行分组。但是,必须引用圆括号和许多操作符,以避免shell对它们求值。
因为expr使用多精度算术,所以它适用于比机器寄存器更宽的整数。
唯一的选项是 --help和 --version。参见第2章[常用选项],第2页。选项必须在操作数之前。
退出状态:
0 如果表达式既不是空也不是0;
1 如果表达式为空或0;
2 如果表达式无效,
3 如果发生内部错误(例如,算术溢出)。
1、字符串表达式
expr 支持模式匹配和其他字符串操作符。这些操作符的优先级高于数字和关系操作符(在下一节中)。
‘string : regex’
执行模式匹配。参数被转换为字符串,第二个参数被认为是一个(基本的,像GNU grep一样)正则表达式,隐式地前缀 ^。然后根据这个正则表达式匹配第一个参数。
如果regex不使用‘\(’和‘\)’,则:表达式返回匹配的字符数,如果匹配失败则返回0。
如果regex使用‘\(’和‘\)’,则:表达式返回与子表达式匹配的字符串部分,如果匹配失败或子表达式没有参与匹配,则返回空字符串。
只有第一个‘\( ... \)’ 对与返回值相关;附加对仅对正则表达式操作符进行分组才有意义。
在正则表达式中,\+,\?,和\|是分别匹配一个或多个、0或1或单独的选项的操作符。这些操作符是GNU扩展。有关正则表达式语法的详细信息,请参见《GNU Grep手册》中的“正则表达式”章节。一些例子在第171页的16.4.4节[expr的例子]中。
‘match string regex’
进行模式匹配的另一种方法。这与 ‘string : regex’ 相同。
‘substr string position length’
返回字符串的子字符串,该字符串以长度为最大长度的位置开始。如果位置或长度为负数、零或非数字,则返回空字符串。
‘index string charset’
返回在字符串中找到字符集第一个字符的第一个位置。如果在字符串中没有找到字符集中的字符,则返回0。
‘length string’
返回字符串的长度。
‘+ token’
将token解释为字符串,即使它是match之类的关键字或/之类的操作符。这使得可以测试 expr length + "$x" 或 expr + "$x" : '.*/\(.\)' 并让它做正确的事情,即使$x的值恰好是(例如)/或index。这个操作符是一个GNU扩展。
可移植shell脚本应该使用 " $token" : ' \(.*\)' 而不是+ "$token"。
要使expr将关键字解释为字符串,必须使用引号操作符。
2、数值表达式
expr 支持常用的数值运算符,按优先级递增的顺序排列。这些数字操作符的优先级低于前一节中描述的字符串操作符,而高于连接符(下一节)。
‘+ -’
加减法。两个参数都被转换为整数;如果不能这样做,则会发生错误。
‘* / %’
乘,除,余。两个参数都被转换为整数;如果不能这样做,则会发生错误。
3、expr的关系
expr 支持常用的逻辑连接和关系。这些操作符的优先级低于字符串和数字操作符(前几节)。这是列表,优先级最低的操作符。
‘|’
如果它既不为空也不为零,则返回它的第一个参数,如果它既不为空也不为零,则返回它的第二个参数,否则为0。如果它的第一个参数既不为空也不为零,则它不会计算第二个参数。
‘&’
如果两个参数都不为空或零,则返回第一个参数,否则为0。如果第一个参数为空或零,则不计算第二个参数。
‘< <= = == != >= >’
比较参数,如果关系为真返回1,否则返回0。==是=的同义词。Expr首先尝试将两个参数转换为整数并进行数值比较;如果任何一个转换失败,它使用LC_COLLATE语言环境指定的字符排序序列进行字典比较。
4、使用expr的示例
这里有几个例子,包括shell元字符的引号。
在bourne兼容的shell中,向shell变量foo添加1:
foo=$(expr $foo + 1)
打印存储在$fname中的文件名的非目录部分,不需要包含/:
expr $fname : '.*/\(.*\)' '|' $fname
下面的例子显示\+是一个运算符:
expr aaa : 'a\+'
⇒ 3
expr abc : 'a\(.\)c'
⇒ b
expr index abcdef cz
⇒ 3
expr index index a
error expr: syntax error
expr index + index a
⇒ 0
【busybox】【expr】指令介绍
NA
【linux】【expr】指令介绍
NA
使用示例:
NA