通用求值表達式: 通過給定的操作(參數必須以空格分開)連接參數,并對參數求值.可以使算術操作, 比較操作, 字符串操作或者是邏輯操作.
- expr 3 + 5
-
返回 8
- expr 5 % 3
-
返回 2
- expr 1 / 0
-
返回錯誤消息, expr: division by zero
不允許非法的算術操作.
- expr 5 \* 3
-
返回 15
在算術表達式expr中使用乘法操作時, 乘法符號必須被轉義.
- y=`expr $y + 1`
-
增加變量的值, 與 let y=y+1 和 y=$(($y+1)) 的效果相同. 這是使用算術表達式的一個例子.
- z=`expr substr $string $position $length`
-
在位置$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]*` 完全等價.
|
上邊的腳本展示了expr是如何使用轉義的括號對 -- \( ... \) -- 和 正則表達式 一起來分析和匹配子串. 下邊是另外一個例子, 這次的例子是真正的應用用例.
1 # 去掉字符串開頭和結尾的空白. 2 LRFDATE=`expr "$LRFDATE" : '[[:space:]]*\(.*\)[[:space:]]*$'` 3 4 # 來自于 Peter Knowle的 "booklistgen.sh" 腳本 5 #+ 用來將文件轉換為Sony Librie格式. 6 # (http://booklistgensh.peterknowles.com) |