2016-07-14 118 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

相关问题