檢查 bash 腳本的參數是所有數字的字元串
Bash常見問題解答說
如果您要驗證一個簡單的“數字字元串”,您可以使用 glob 來驗證:
# Bash if [[ $foo = *[!0-9]* ]]; then echo "'$foo' has a non-digit somewhere in it" else echo "'$foo' is strictly numeric" fi
我想,“天哪,這看起來又好又簡單”。然後我將它完全粘貼到腳本中,除了我在第一個 echo 之後添加了“exit 1”並更改
$foo
為$1
,所以它看起來像if [[ $1 = *[!0-9]* ]]; then echo "'$1' has a non-digit somewhere in it" exit 1 else echo "'$1' is strictly numeric" fi
然後我嘗試執行它並得到
$ sh foo.sh bar bar foo.sh: 6: [[: not found 'bar' is strictly numeric
我是 Bash 文盲,我很慚愧地說,所以我不知道這裡有什麼問題。在線上 Bash 手冊的支持下,我的印像是,與正則表達式匹配的運算符是
=~
,但改變它並沒有任何區別。在這裡似乎有問題的那個運算符看起來很標準,儘管我不知道and[[
之間有什麼區別,據我所知,它們都對應於測試表達式。我正在使用帶有 bash 的 Debian 擠壓[[ ]]``[ ]
$ bash --version GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
Debian 說版本
4.1-3
。
sh
如果那是 bash 腳本,你為什麼要打電話?很明顯,在您的系統上,sh
不是 bash,而是 Bourne/POSIX 系列中的其他一些 shell。事實上,它是dash,一個較小的外殼,專為低記憶體消耗和速度而設計,幾乎只支持POSIX構造和內置實用程序。
[[ … ]]
是 Bourne 語法的 ksh 擴展,由 bash 和 zsh 採用,但不是由 POSIX 採用。在可移植腳本中,您需要[ … ]
用於測試。標準構造不支持模式匹配;標準的習慣用法是使用一個case
構造:case $1 in # branch to the first pattern that $1 matches *[!0-9]*) # pattern = anything containing a non-digit echo not a number # do this if the first pattern triggered ;; # end of this case branch *) # pattern = anything (else) echo successor of $(($1-1)) # do this if the second pattern triggered ;; # end of this case branch esac # end of the case construct
這是一個測試其參數是否為全數字的函式:
is_all_digits () { case $1 in *[!0-9]*) false;; esac }
題外話:我最初在上面的程式碼段中打了一個錯字:我寫了
$(($0-1))
. 這導致了看起來很奇怪的錯誤消息:$ ash foo.sh 42 foo.sh: 4: arithmetic expression: expecting EOF: "foo.sh-1" $ ash ./foo.sh 42 ./foo.sh: 4: arithmetic expression: expecting primary: "./foo.sh-1" $ ksh ./foo.sh 42 ./foo.sh: line 3: foo.sh: invalid variable name $ pdksh ./foo.sh 42 ./foo.sh[4]: ./foo.sh-1: unexpected `.' $ bash foo.sh 42 foo.sh: line 3: foo.sh-1: syntax error: invalid arithmetic operator (error token is ".sh-1") $ bash ./foo.sh 42 ./foo.sh: line 3: ./foo.sh-1: syntax error: operand expected (error token is "./foo.sh-1") $ zsh foo.sh 42 foo.sh:3: bad floating point constant
$0
是腳本的名稱,所以要計算的算術表達式是foo.sh-1
or./foo.sh-1
。您可以查看 shell 中錯誤消息的多樣性。看到 ash 的消息和沒有 bash 的消息./
最清晰,我有點驚訝:沒有其他 shell 提到問題出在算術表達式中。Ash 和 pdksh 確實會因為報告錯誤太遠而獲得停靠點。