检查 shell 脚本中的 string 是否既不为空也不为空

我正在尝试运行下面的 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
333731 次浏览

用于检查 shell 中的空字符串

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

或者

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

您需要在 !=的两边留出空间。请将您的代码更改为:

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

检查字符串是空的还是只包含空格,可以使用:

shopt -s extglob  # more powerful pattern matching


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

请参见 Bash 手册中的 壳参数展开模式匹配

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

去掉多余的空格字符串(中间的空格也限定为一个空格) :

trimmed=`echo -- $original`

--确保如果 $original包含回显所理解的开关,它们仍将被视为要回显的正常参数。同样重要的是,不要把 ""周围的 $original,或空格将不会得到删除。

然后你可以检查 $trimmed是否为空。

[ -z "$trimmed" ] && echo "empty!"

另一个快速测试字符串中除了空间之外是否有其他内容。

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

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

然后,在我们的大小写空间中,前两个斜杠的意思是匹配下面的 所有。然后第三个斜杠后跟替换(空)字符串,并以“}”结束。请注意与通常的正则表达式语法的区别。

你可以阅读更多关于 在 bash shell 脚本中进行字符串操作的资料。

[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

从字符串中去掉所有换行符和空格将导致空行减少到无可测试和操作的值