[程式]

/usr/bin/expr

[Shared
Library]
/lib/libc.so.6 /lib/libdl.so.2 /lib/ld-linux.so.2

[語法]

expr 數學/邏輯/字串運算式(Expression) 或者,
expr 選項

[用途說明]

expr取其參數作為運算式, 並且將運算結果寫到標準輸出上. 運算元與運算子間必須要有空白隔開 (讓每個token都是獨立的參數)
運算元(Operand)可以是字串或者是數字, 端看運算子(Operator)的需求而定

expr允許的運算元:

| : 代表邏輯的OR. 若第一個運算元是0或是空字串就對第二個運算元做運算及印出結果, 否則 對第一個運算元做運算及印出結果.

範例:
$ expr '' \| ccc
ccc
$ expr 5 \| 6
5
$

值得注意的是|符號前需要加上倒斜線防止shell將其當作pipeline處理.

& : 代表邏輯的AND. 其動作是只要兩個運算元之一是0或是空字串就呈現0, 否則對第一個運算 元做運算及呈現.

範例:
$ expr 5 \& 6
5

加上倒斜線的原因是為了防止shell將其當作流程控制字元.

<, <=, =, !=, >=, >:
大小的比較運算. 若為真就呈現1, 否則呈現0.

範例:
$ expr 5 \< 6
1
+, -, *, /, %: (%是取餘數) :
就是一般的算數運算
範例:
$ expr 1 + 2
3
字串運算元: `:', match, substr, index, length, quote: 下面分別列出其語法(syntax) `:': 格式: 字串: REGEX(Regular expression) 用途是樣式比對(Pattern matching).

而REGEX有兩種情形, 在下面分別討論:

第一種情形:
REGEX不含`\('與`\)'時(也就是不包含匹配的左右小括號) 那麼運算結果就是匹配的字數. 範例: $ expr aaabcdefg : aaa 3 $ 也就是REGEX為"aaa", 而比對結果是有3個字元相符. 值得注意的是REGEX在 比對時會自動加上`^'字元, 也就是只會從字串的開頭開始比對. 簡單的例子: $ expr abca : a

1 $

  可以看出其比對的樣式等同於"^a", 只符合"abca"字串中開頭第一個"a".
若REGEX無法被匹配時, 就呈現0.
第二種情形: REGEX含`\('與`\)'時, 如此的運算結果變成取括號配對中的子字串.
範例:
$ expr abcdef : 'a\(..\)d'
bc


可以看出呈現的就是括號中的子表示式.
若REGEX無法被匹配時, 就呈現空字串.
在REGEX中, '\+'字元表示重複前一個字元一次到無限多次, 而'\?'字元表示重複前一個字元
零次或一次. '\|'字元表示左邊的樣式(Pattern)或者右邊的樣式取其一.例子如下:
`+'的例子: $ expr aaab : 'a\+'


`?'的例子: $ expr aaab : 'a\?'


`|'的例子: $ expr ababaabc : '\(\(a\|b\)\+\)'
ababaab
其中REGEX就等於(a|b)+, 即a或b重複一次以上
match: 格式: match 字串 REGEX
等效於 字串 : REGEX 的寫法.
substr: 格式: substr 字串S 位置P 長度L

呈現的結果就是將字串S從位置P處節取出長度L的子字串. 當然若字串S的長度不足, 那麼呈現 出來的子字串長度就會小於L. 值得一提的是P從1開始計算. 例子:
$ expr substr abcdef 2 3 bcd

index:
格式: index 字串S 字元集合C 傳回字元集合C中任何一個字元在S中第一次出現的位置. 如果S中完全沒有出現字元集合C中 任何一個字元, 就傳回0. 例子: $ expr zzzza a 5
length:
格式: length 字串S
傳回字串S的長度

[傳回值]

如果運算式本身不是null也不是0, 就傳回0 如果運算式是null或者是0, 就傳回1 如果運算式本身不合法, 就傳回2