Bash - 正規表示式比對數位元組

Bash - 正規表示式比對數位元組

我想檢查透過 read 命令寫入 bash 變數的字串是否是兩個數字的元組。據我所知,這應該可以通過

if [[ "$input" =~ "$regex" ]]; then ...

對於由兩個數字組成的元組,至少由一個空格分隔,並且前後有任意數量的空格,我嘗試過

$regex="^ *[0-9]+ +[0-9]+ *$"

哪個應該要匹配

12 123
  23 3246543
123     345     
     34      23
1 234

但不是

123 123 123
1235124
123w123 123
etc.

然而,這不起作用......

答案1

POSIXshell 腳本函數,使用參數擴展來獲取第一個和第二個數字,-eq僅當有兩個參數均為相同數字時才會成功(如果參數較少或較多,或者如果有包含字母,則失敗) ,並!=檢查空格。退貨真的只有當它是兩個數字元組時:

is_tup() { [ ${1% *} -eq ${1% *} -a \ 
             ${1#* } -eq ${1#* } -a "${1% *}" != "$1" ] 2> /dev/null ; }

測試:

echo '12 123
  23 3246543
123     345     
     34      23
1 234
123 123 123
1235124
123w123 123' | 
while read x ; do is_tup "$x" && a=yes || a=no ; printf '%s\t%s\n' $a "$x" ; done

輸出:

yes 12 123
yes 23 3246543
yes 123     345
yes 34      23
yes 1 234
no  123 123 123
no  1235124
no  123w123 123

相關內容