# Prayer

posts - 1256, comments - 190, trackbacks - 0, articles - 0
C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
expr

expr 3 + 5

expr 5 % 3

expr 1 / 0

expr 5 \* 3

y=`expr \$y + 1`

z=`expr substr \$string \$position \$length`

Example 12-9. 使用 expr

 ```1 #!/bin/bash 2 3 # 展示一些 'expr'的使用 4 # ===================== 5 6 echo 7 8 # 算术 操作 9 # ---- ---- 10 11 echo "Arithmetic Operators" 12 echo 13 a=`expr 5 + 3` 14 echo "5 + 3 = \$a" 15 16 a=`expr \$a + 1` 17 echo 18 echo "a + 1 = \$a" 19 echo "(incrementing a variable)" 20 21 a=`expr 5 % 3` 22 # 取模操作 23 echo 24 echo "5 mod 3 = \$a" 25 26 echo 27 echo 28 29 # 逻辑 操作 30 # ---- ---- 31 32 # true返回 1 ,false 返回 0 , 33 #+ 而Bash的使用惯例则相反. 34 35 echo "Logical Operators" 36 echo 37 38 x=24 39 y=25 40 b=`expr \$x = \$y` # 测试相等. 41 echo "b = \$b" # 0 ( \$x -ne \$y ) 42 echo 43 44 a=3 45 b=`expr \$a \> 10` 46 echo 'b=`expr \$a \> 10`, therefore...' 47 echo "If a > 10, b = 0 (false)" 48 echo "b = \$b" # 0 ( 3 ! -gt 10 ) 49 echo 50 51 b=`expr \$a \< 10` 52 echo "If a < 10, b = 1 (true)" 53 echo "b = \$b" # 1 ( 3 -lt 10 ) 54 echo 55 # Note escaping of operators. 56 57 b=`expr \$a \<= 3` 58 echo "If a <= 3, b = 1 (true)" 59 echo "b = \$b" # 1 ( 3 -le 3 ) 60 # 也有 "\>=" 操作 (大于等于). 61 62 63 echo 64 echo 65 66 67 68 # 字符串 操作 69 # ------ ---- 70 71 echo "String Operators" 72 echo 73 74 a=1234zipper43231 75 echo "The string being operated upon is \"\$a\"." 76 77 # 长度: 字符串长度 78 b=`expr length \$a` 79 echo "Length of \"\$a\" is \$b." 80 81 # 索引: 从字符串的开头查找匹配的子串, 82 # 并取得第一个匹配子串的位置. 83 b=`expr index \$a 23` 84 echo "Numerical position of first \"2\" in \"\$a\" is \"\$b\"." 85 86 # substr: 从指定位置提取指定长度的字串. 87 b=`expr substr \$a 2 6` 88 echo "Substring of \"\$a\", starting at position 2,\ 89 and 6 chars long is \"\$b\"." 90 91 92 # 'match' 操作的默认行为就是 93 #+ 从字符串的开始进行搜索,并匹配第一个匹配的字符串. 94 # 95 # 使用正则表达式 96 b=`expr match "\$a" '[0-9]*'` # 数字的个数. 97 echo Number of digits at the beginning of \"\$a\" is \$b. 98 b=`expr match "\$a" '\([0-9]*\)'` # 注意需要转义括号 99 # == == + 这样才能触发子串的匹配. 100 echo "The digits at the beginning of \"\$a\" are \"\$b\"." 101 102 echo 103 104 exit 0```

: 操作可以替换 match. 比如, b=`expr \$a : [0-9]*`与上边所使用的 b=`expr match \$a [0-9]*` 完全等价.

 ```1 #!/bin/bash 2 3 echo 4 echo "String operations using \"expr \\$string : \" construct" 5 echo "===================================================" 6 echo 7 8 a=1234zipper5FLIPPER43231 9 10 echo "The string being operated upon is \"`expr "\$a" : '\(.*\)'`\"." 11 # 转义括号对操作. == == 12 13 # *************************** 14 #+ 转移括号对 15 #+ 用来匹配一个子串 16 # *************************** 17 18 19 # 如果不转义括号的话... 20 #+ 那么 'expr' 将把string操作转换为一个整数. 21 22 echo "Length of \"\$a\" is `expr "\$a" : '.*'`." # 字符串长度 23 24 echo "Number of digits at the beginning of \"\$a\" is `expr "\$a" : '[0-9]*'`." 25 26 # ------------------------------------------------------------------------- # 27 28 echo 29 30 echo "The digits at the beginning of \"\$a\" are `expr "\$a" : '\([0-9]*\)'`." 31 # == == 32 echo "The first 7 characters of \"\$a\" are `expr "\$a" : '\(.......\)'`." 33 # ===== == == 34 # 再来一个, 转义括号对强制一个子串匹配. 35 # 36 echo "The last 7 characters of \"\$a\" are `expr "\$a" : '.*\(.......\)'`." 37 # ==== end of string operator ^^ 38 # (最后这个模式的意思是忽略前边的任何字符,直到最后7个字符, 39 #+ 最后7个点就是需要匹配的任意7个字符的字串) 40 41 echo 42 43 exit 0```

上边的脚本展示了expr是如何使用转义的括号对 -- \( ... \) --正则表达式 一起来分析和匹配子串. 下边是另外一个例子, 这次的例子是真正的应用用例.
 ```1 # 去掉字符串开头和结尾的空白. 2 LRFDATE=`expr "\$LRFDATE" : '[[:space:]]*\(.*\)[[:space:]]*\$'` 3 4 # 来自于 Peter Knowle的 "booklistgen.sh" 脚本 5 #+ 用来将文件转换为Sony Librie格式. 6 # (http://booklistgensh.peterknowles.com)```