Ubuntu 10.04下expr命令用于计算数值与处理字符串,其常用的使用方法如下脚本所示:
注:命令行后#后面的是输出结果与解释。
#!/bin/bash
#expr - evaluate expressions
str="string in 1 line."
echo "*** + - * / % ***" #数字运算,最终返回计算结果。不过仅支持整数运算,如果使用浮点数将会报错
echo `expr 8 + 2` #10,数字加法
echo `expr 8 - 2` #6,数字减法
echo `expr 8 \* 2` #16,数字乘法,必须添加\以转义,不然expr会识别为正则表达式扩展而执行失败
echo `expr 8 / 2` #4,数字除法
echo `expr 8 % 2` #0,数字取余数
echo "*** : match ***" #字符匹配,共有2种方式,用:与match是等价的。其中第2个参数是正则表达式,并且会从第1个参数所代表的字符串中从头开始匹配,最终返回正确匹配的字符数;如果匹配失败,则返回0
echo `expr "$str" : "ing"` #0,因为无法匹配字符串的开头,所以匹配失败
echo `expr "$str" : "st"` #2,成功匹配字符串的前2个字符
echo `expr "$str" : "s.*"` #17,成功匹配整个字符串。因为s可以匹配字符串的开头,之后的.*代表任意个数的任意字符,所以可以匹配剩余的所有字符
echo `expr match "$str" ".*in"` #15,成功匹配到字符串中line的in处。.*的含义同上,不过in在字符串中有多处,如何判断返回哪个呢?原来正则表达式的规则是尽量匹配更多的字符,所以将匹配到最后一个in处
echo `expr match "$str" ".*[0-9]"` #11,成功匹配到字符串中的数字1处。.*的含义同上,[0-9]代表一个数字
echo `expr match "$str" ".*"` #17,成功匹配整个字符串。.*的含义同上
echo "*** length ***" #字符串长度,返回字符串中所有字符的个数
echo `expr length "$str"` #17,返回字符串的长度
echo "*** index ***" #字符索引值,返回字符在字符串中第一次出现的索引值,此索引值从1开始;如果未找到则返回0
echo `expr index "$str" "a"` #0,字符串中未找到字符a
echo `expr index "$str" "i"` #4,返回字符i在字符串中第一次出现的索引值,即位于string中的i的索引
echo `expr index "$str" "."` #17,返回最后一个字符.的索引值。此处的字符.并没有特殊含义,所以不须转义;同理还有*等特殊字符
echo `expr index "$str" "rs"` #1,此处返回s在字符串中的索引值。即如果给出的第2个参数不是单个字符,则将依次查找每个字符在字符串中的索引值,最终返回数值最小的那个索引值
echo "*** substr ***" #提取子字符串,第2个参数是开始提取的索引值,第3个参数是提取子字符串的长度,最终返回所提取的子字符串
echo `expr substr "$str" 13 5` #line.,成功提取了最后一个单词和句点
echo `expr substr "$str" 1 6` #string,成功提取了第一个单词
echo `expr substr "$str" 10 20` #1 line.,成功提取了从数字1开始直到字符串结尾的字符串。虽然字符串剩余的字符个数不足20,但命令会自动忽略多余的索引
注:命令行后#后面的是输出结果与解释。
#!/bin/bash
#expr - evaluate expressions
str="string in 1 line."
echo "*** + - * / % ***" #数字运算,最终返回计算结果。不过仅支持整数运算,如果使用浮点数将会报错
echo `expr 8 + 2` #10,数字加法
echo `expr 8 - 2` #6,数字减法
echo `expr 8 \* 2` #16,数字乘法,必须添加\以转义,不然expr会识别为正则表达式扩展而执行失败
echo `expr 8 / 2` #4,数字除法
echo `expr 8 % 2` #0,数字取余数
echo "*** : match ***" #字符匹配,共有2种方式,用:与match是等价的。其中第2个参数是正则表达式,并且会从第1个参数所代表的字符串中从头开始匹配,最终返回正确匹配的字符数;如果匹配失败,则返回0
echo `expr "$str" : "ing"` #0,因为无法匹配字符串的开头,所以匹配失败
echo `expr "$str" : "st"` #2,成功匹配字符串的前2个字符
echo `expr "$str" : "s.*"` #17,成功匹配整个字符串。因为s可以匹配字符串的开头,之后的.*代表任意个数的任意字符,所以可以匹配剩余的所有字符
echo `expr match "$str" ".*in"` #15,成功匹配到字符串中line的in处。.*的含义同上,不过in在字符串中有多处,如何判断返回哪个呢?原来正则表达式的规则是尽量匹配更多的字符,所以将匹配到最后一个in处
echo `expr match "$str" ".*[0-9]"` #11,成功匹配到字符串中的数字1处。.*的含义同上,[0-9]代表一个数字
echo `expr match "$str" ".*"` #17,成功匹配整个字符串。.*的含义同上
echo "*** length ***" #字符串长度,返回字符串中所有字符的个数
echo `expr length "$str"` #17,返回字符串的长度
echo "*** index ***" #字符索引值,返回字符在字符串中第一次出现的索引值,此索引值从1开始;如果未找到则返回0
echo `expr index "$str" "a"` #0,字符串中未找到字符a
echo `expr index "$str" "i"` #4,返回字符i在字符串中第一次出现的索引值,即位于string中的i的索引
echo `expr index "$str" "."` #17,返回最后一个字符.的索引值。此处的字符.并没有特殊含义,所以不须转义;同理还有*等特殊字符
echo `expr index "$str" "rs"` #1,此处返回s在字符串中的索引值。即如果给出的第2个参数不是单个字符,则将依次查找每个字符在字符串中的索引值,最终返回数值最小的那个索引值
echo "*** substr ***" #提取子字符串,第2个参数是开始提取的索引值,第3个参数是提取子字符串的长度,最终返回所提取的子字符串
echo `expr substr "$str" 13 5` #line.,成功提取了最后一个单词和句点
echo `expr substr "$str" 1 6` #string,成功提取了第一个单词
echo `expr substr "$str" 10 20` #1 line.,成功提取了从数字1开始直到字符串结尾的字符串。虽然字符串剩余的字符个数不足20,但命令会自动忽略多余的索引