Posted on 2009-12-16 23:03
Prayer 閱讀(712)
評論(0) 編輯 收藏 引用 所屬分類:
Shell
expr
通用求值表達式: 通過給定的操作(參數必須以空格分開)連接參數,并對參數求值.可以使算術操作, 比較操作, 字符串操作或者是邏輯操作.
- 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]*` 完全等價.
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)
|