127

我正在尝试运行以下 shell 脚本,该脚本应该检查字符串是否既不是空格也不是空的。但是,对于所有提到的 3 个字符串,我得到了相同的输出。我也尝试过使用“[[”语法,但无济于事。

这是我的代码:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str"!=" " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2"!=" " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3"!=" " ]; then
        echo "Str3 is not null or space"
fi

我得到以下输出:

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space
4

6 回答 6

156

您需要在!=. 将您的代码更改为:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str" != " " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
        echo "Str3 is not null or space"
fi
于 2012-11-22T09:40:50.393 回答
79

用于检查 shell 中的空字符串

if [ "$str" == "" ];then
   echo NULL
fi

或者

if [ ! "$str" ];then
   echo NULL
fi
于 2012-11-22T09:37:22.397 回答
19

如果您需要检查任何数量的空格,而不仅仅是单个空格,您可以这样做:

去除多余的空白字符串(也将中间的空白压缩为一个空格):

trimmed=`echo -- $original`

--确保如果包含回显可以理解的$original开关,它们仍将被视为要回显的正常参数。同样重要的是不要放置""$original否则空格将不会被删除。

之后,您可以检查是否$trimmed为空。

[ -z "$trimmed" ] && echo "empty!"
于 2012-11-22T09:43:30.560 回答
14

另一个快速测试字符串是否包含空间但包含一些内容。

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

“-n”表示非零长度字符串。

然后前两个斜杠表示匹配以下所有内容,在我们的例子中是空格。然后第三个斜杠后面是替换(空)字符串并用“}”关闭。请注意与通常的正则表达式语法的区别。

您可以在此处阅读有关bash shell 脚本中的字符串操作的更多信息。

于 2016-05-23T18:36:46.267 回答
8

要检查字符串是否为空或仅包含空格,您可以使用:

shopt -s extglob  # more powerful pattern matching

if [ -n "${str##+([[:space:]])}" ]; then
    echo '$str is not null or space'
fi

请参阅Bash 手册中的Shell 参数扩展模式匹配

于 2012-11-22T09:41:17.503 回答
1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

从字符串中删除所有换行符和空格将导致空白的减少到可以测试和采取行动的任何内容

于 2017-05-01T11:40:43.390 回答