Shell

檢查 bash 腳本的參數是所有數字的字元串

  • April 29, 2011

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-1or ./foo.sh-1。您可以查看 shell 中錯誤消息的多樣性。看到 ash 的消息和沒有 bash 的消息./最清晰,我有點驚訝:沒有其他 shell 提到問題出在算術表達式中。Ash 和 pdksh 確實會因為報告錯誤太遠而獲得停靠點。

引用自:https://unix.stackexchange.com/questions/12253