我知道一種使用正則運算式和 =~ 運算子檢查輸入是否為數字的方法,但是,先決條件是使用 [[ ]]。不支持 [[ ]] 并且必須使用沒有 =~ 運算子的 [ ] 的替代方案是什么?
我發現正在使用該選項 [ -o ],但是在這種特殊情況下,這將如何作業呢?理想情況下,我想舉例說明這條線 if ![[ ${NUMBER} =~ ${RE} ]] 將使用 [ ] 而不是 [[ ]] 撰寫。
這是一個例子:
RE=^[0-9] $
read -p "Enter the number: " NUMBER
if ! [[ ${NUMBER} =~ ${RE} ]];then
echo 'Please enter a single positive number consisting of [0-9] digits' 1>&2
exit 1
fi
uj5u.com熱心網友回復:
您可以使用 POSIX 實用程式expr進行正則運算式匹配:
if expr "$number" : '[0-9][0-9]*$' > /dev/null; then
echo "$number is a number"
fi
請注意,您可以省略^,因為一個怪癖(?)expr是所有匹配項都隱式錨定到字串的開頭。(如果您想忽略字串的某些前綴,則需要添加.*顯式添加到正則運算式的開頭。)
expr輸出匹配字符的數量或第一個捕獲組的值。它還僅支持 POSIX 基本正則運算式,因此您會注意到詳細的重復[0-9][0-9]*代替了 運算子以匹配 1 個或多個字符。
uj5u.com熱心網友回復:
如果您的目標是 POSIX sh,您可以使用grepwith-q進行靜默輸出、-x整行匹配以及-E擴展的正則運算式語法。
if ! printf '%s\n' "$number" | grep -qxE '[0-9] '; then
exit 1
fi
如果您需要 POSIX 之外的更多可移植性,請堅持使用基本的正則運算式語法并將grep的輸出重定向到/dev/null.
if ! printf '%s\n' "$number" | grep '^[0-9]\ $' >/dev/null 2>&1; then
exit 1
fi
兩個版本都依賴于$number單行字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/481964.html
