2015-08-16 49 views
1

如果用戶輸入包含一個單引號,如猛砸如果測試中斷,如果在用戶輸入的至少一個單引號

$ echo "Hello my name Foo I'm 18" | ./test.sh 

它失敗,錯誤syntax error: operand expected (error token is "'") 代碼:

#!/bin/sh 
while read line 
do 
    str=$line 
    for ((i = 0; i < ${#str}; i++)) 
    do 
     if [[ "${str:$i:1}" -gt 4 ]] <-- fails 
     then 
      echo 'foo' 
     elif [[ "${str:$i:1}" -lt 4 ]] <--- fails 
     then 
      echo 'bar' 
     else 
      echo 'not a number' 
     fi 
    done  
done 

如何我可以讓我的代碼在用戶鍵入撇號/單引號時工作嗎?

+0

你是指「*精確*單引號」或「*至少*單引號」? – Jubobs

+0

@Jubobs糾正了,謝謝 – tgun926

+0

問題是'-gt'和'-lt'需要整型參數,如果參數是一個有效的標識符(例如'H','e'等),它會被擴展爲參數。在大多數情況下,這些參數不存在並且評估爲0(因此大量的'bar'輸出。''',但不是一個有效的參數名稱,所以你會得到一個錯誤。首先將字符串與整數進行比較,但是?我認爲你需要解釋你正在努力完成的任務,以便正確解決它。 – chepner

回答

2

您可以使用:

#!/bin/bash 

while read -r line; do 
    str=$line 
    for ((i = 0; i < ${#str}; i++)); do 
     ch="${str:$i:1}" 
     if [[ $ch == [0-9] && $ch -gt 4 ]]; then 
      echo 'foo' 
     elif [[ $ch == [0-9] && $ch -lt 4 ]]; then 
      echo 'bar' 
     else 
      echo 'not a number' 
     fi 
    done 
done 
  • 使用/bin/bash,而不是/bin/sh
  • 檢查字符是用$ch == [0-9]使用-gt-lt運營商之前,以避免操作數預計錯誤數字。
+0

對我來說,就像這樣會提供錯誤的結果,例如,輸入是' (也可以用'$ i!= * [!0-9] *'來檢查'$ i'是否是一個數字) – rici

相關問題