expr — 運算式求值 (字串、算術、邏輯)
expr 是 POSIX 標準指令,Shell 腳本中進行字串操作與整數運算的基礎工具。注意:參數之間必須以空白分隔,運算子若為 Shell 特殊字元 (* ( ) | 等) 需跳脫。
字串操作
| 語法 | 功能 | 範例 | 結果 |
expr length "STRING" | 字串長度 (字元數) | expr length "hello world" | 11 |
expr substr "STRING" POS LEN | 擷取子字串 (1-based 索引) | expr substr "hello world" 7 5 | world |
expr index "STRING" CHARS | 尋找 CHARS 中任一字元在 STRING 首次出現位置 (1-based) | expr index "hello world" "aeiou" | 2 (e) |
expr match "STRING" REGEX | 從開頭匹配 REGEX (BRE),回傳匹配長度 | expr match "hello123" "hello[0-9]*" | 8 |
expr "STRING" : "REGEX" | 同 match (冒號寫法) | expr "hello123" : "hello\([0-9]*\)" | 123 (若 REGEX 有 \(\) 則輸出捕獲組) |
expr quote TOKEN | 輸出 TOKEN 字面值 (避免被解釋為運算子) | expr quote + | + |
整數算術運算
| 運算子 | 功能 | 範例 | 結果 |
+ - * / % | 加減乘除餘 | expr 14 % 9 | 5 |
= > >= < <= != | 比較 (真=1, 偽=0) | expr 5 \> 3 | 1 |
& | | 邏輯 AND/OR (短路) | expr 5 \& 3 | 5 (非零即真,回傳第一個真值) |
實用腳本範例
#!/bin/bash
filename="report_20240115_final.pdf"
# 擷取日期部分 (假設固定格式)
date_part=$(expr substr "$filename" 8 8) # 20240115
echo "Date: $date_part"
# 判斷副檔名
if [ $(expr "$filename" : ".*\.pdf$") -gt 0 ]; then
echo "PDF file"
fi
# 計算檔案大小 (KB → MB)
size_kb=2048
size_mb=$(expr $size_kb / 1024)
echo "${size_kb}KB = ${size_mb}MB"
現代替代方案 (Bash/Zsh 內建,效能更好)
| 操作 | expr | Bash 內建 |
| 長度 | expr length "$s" | ${#s} |
| 子字串 | expr substr "$s" 3 5 | ${s:2:5} (0-based) |
| 模式匹配長度 | expr "$s" : 'regex' | [[ $s =~ regex ]]; echo ${#BASH_REMATCH[0]} |
| 算術 | expr 5 + 3 | $((5+3)) 或 let "a=5+3" |
建議:純 Shell 腳本優先使用內建語法;需 POSIX 相容或極簡環境 (initramfs、busybox) 才用 expr。