【问题标题】:Shell script to check for string and special characters用于检查字符串和特殊字符的 Shell 脚本
【发布时间】:2016-07-15 00:04:18
【问题描述】:

我正在编写一个示例 shell 脚本,如果字符串不等于“sample”并且字符串不包含特殊字符,我必须执行一些操作。我尝试了下面的代码,但出现语法错误。这是正确的做法吗?如果没有,正确的做法是什么?

#!/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" != *['!'@#\$%^\&*()_+]* ]]'

【问题讨论】:

  • 如果您遇到语法错误,则说明您没有使用bash 运行脚本。这是完全有效的bash 代码。
  • @chepner 谢谢。请查看更新内容
  • 啊,这看起来可能是 3.2 中的解析器错误。它肯定在 4.3 中修复;我不确定它可能提前多久被修复,或者它是否在发行说明中明确提及。转义括号 (\(\)) 似乎适用于 3.2 和 4.x。

标签: bash shell


【解决方案1】:

这可能是另一种选择

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

注意

  1. 检查 bash [ character classes ]
  2. a 字符类之前的 ^ 否定它,本质上我们正在寻找除字母数字之外的任何内容
  3. 类似地! 在测试表达式否定它之前。
  4. + 至少检查一次。

【讨论】:

    【解决方案2】:

    在 bash shell 上一切正常。

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

    如果你像下面这样运行,这可能是错误的结果。

    user@host:/tmp$  ksh test.sh
    Stop
    

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 2016-01-14
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多