如何检测shell脚本变量中的空格

时间:2010-12-15 11:29:34

标签: linux shell

例如string = "test test test"

我想在找到字符串中出现任何空格后,它应该回显错误并退出其他进程。

6 个答案:

答案 0 :(得分:2)

case语句在这种情况下很有用:

case "$string" in 
    *[[:space:]]*) 
        echo "argument contains a space" >&2
        exit 1
        ;; 
esac

处理前导/尾随空格。

答案 1 :(得分:1)

对于纯粹的Bash解决方案:

function assertNoSpaces {
    if [[ "$1" != "${1/ /}" ]]
    then
        echo "YOUR ERROR MESSAGE" >&2
        exit 1
    fi
}

string1="askdjhaaskldjasd"
string2="asjkld askldja skd"

assertNoSpaces "$string1"
assertNoSpaces "$string2" # will trigger error

"${1/ /}"删除输入字符串中的任何空格,如果没有空格,则与原始字符串进行比较时应完全相同。

请注意"${1/ /}"周围的引号 - 这可确保考虑前导/尾随空格。

要匹配多个字符,您可以使用regular expressions定义匹配的模式 - "${1/[ \\.]/}"

更新

更好的方法是使用进程内表达式匹配。由于没有进行字符串操作,它可能会快一点。

function assertNoSpaces {
    if [[ "$1" =~ '[\. ]' ]]
    then
        echo "YOUR ERROR MESSAGE" >&2
        exit 1
    fi
}

有关=~运算符的详细信息,请参阅this pagethis chapter in the Advanced Bash Scripting guide

该操作符是在Bash版本3中引入的,因此请注意您是否使用旧版本的Bash。

更新2

关于评论中的问题:

  
    

如果用户输入,如何处理代码     像“asd”一样意思是双引号     ......我们能处理吗??

  

上面给出的函数应该适用于任何字符串,因此它将取决于您从用户那里获得输入的方式。

假设您正在使用read命令来获取用户输入,您需要注意的一件事是默认情况下反斜杠被视为转义字符,因此它不会像您期望的那样运行。 e.g。

read str              # user enters "abc\"
echo $str             # prints out "abc", not "abc\"
assertNoSpaces "$str" # no error since backslash not in variable

要解决此问题,请使用-r选项将反斜杠视为标准字符。有关详细信息,请参阅read MAN Page

read -r str           # user enters "abc\"
echo $str             # prints out  "abc\"
assertNoSpaces "$str" # triggers error

答案 2 :(得分:0)

您可以将grep用作:

string="test test test"
if ( echo "$string" | grep -q ' ' ); then
        echo 'var has space'
        exit 1
fi

答案 3 :(得分:0)

有多种方法可以做到这一点;使用参数扩展 你可以这样写:

if [ "$string" != "${string% *}" ]; then
     echo "$string contains one or more spaces";
fi

答案 4 :(得分:0)

双括号内的==运算符可以匹配通配符。

if [[ $string == *' '* ]]

答案 5 :(得分:-1)

我在处理路径时遇到了一个非常相似的问题。我选择依靠外壳程序的参数扩展,而不是专门寻找空间。但是,它不会检测到前端或后端的空格。

function space_exit {
  if [ $# -gt 1 ]
  then
    echo "I cannot handle spaces." 2>&1
    exit 1
  fi
}