2016-07-14 156 views
2

我正在寫一個示例shell腳本,如果字符串不等於「sample」且字符串不包含特殊字符,我必須執行一些操作。我嘗試了下面的代碼,但我得到語法錯誤。這是正確的方式嗎?如果不是,那麼做什麼是正確的?Shell腳本來檢查字符串和特殊字符

#!/bin/bash 
    str='sudo' 
    if [ "$str" != "sample" ] && [[ "$str" != *['!'@#\$%^\&*()_+]* ]] 
    then 
     echo "Proceed" 
    else 
     echo "Stop" 
    fi 

我得到的語法錯誤是這樣的:

bash-3.2$ ./test.sh 
./test.sh: line 3: syntax error in conditional expression: unexpected token `(' 
./test.sh: line 3: syntax error near `&*()' 
./test.sh: line 3: `if [ "$str" != "sample" ] || [[ "$str" != *['!'@#\$%^\&*()_+]* ]]' 
+1

如果出現語法錯誤,那麼您沒有使用'bash'運行腳本。這是完全有效的'bash'代碼。 – chepner

+0

@chepner謝謝。請參閱更新內容 – chelulala

+0

嗯,這看起來可能是3.2中的解析器錯誤。它肯定是固定在4.3;我不確定它可能早已修復多少,或者是否在發行說明中明確提及。轉義括號('\(\)')似乎可以在3.2和4.x中工作。 – chepner

回答

1

這可能是一種替代

#!/bin/bash 
str='sudo' 
if ! [ "$str" = "sample" ] && ! [[ "$str" =~ [^[:alnum:]]+ ]] 
then 
    echo "Proceed" 
else 
    echo "Stop" 
fi 

注意

  1. 入住慶典[ character classes ]
  2. ^的字符類取消它之前,在本質上,我們正在尋找其他任何字母數字
  3. 同樣!前的測試表達式取消它。
  4. +檢查至少一次發生。
0

everythink ok on bash shell。

[email protected]:/tmp$ cat test.sh 
#!/bin/bash 
    str='sudo' 
    if [ "$str" != "sample" ] && [[ "$str" != *['!'@#\$%^\&*()_+]* ]] 
    then 
     echo "Proceed" 
    else 
     echo "Stop" 
    fi 

[email protected]:/tmp$ ./test.sh 

Proceed 

如果你像下面那樣運行,這可能是錯誤的結果。

[email protected]:/tmp$ ksh test.sh 
Stop 
+0

請檢查更新後的帖子是否有語法錯誤 – chelulala

相關問題