检查shell脚本中的字符串是否既不为空也不为空


91

我正在尝试运行以下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

Answers:


121

您需要在的两侧放置一个空间!=。将您的代码更改为:

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

非常感谢,它有效。但我想知道为什么分配不使用空格而比较却使用空格。
Shubhanshu Mishra

5
^^是语法。命令行上的第一个单词是命令,后面的是参数。var=value [command [args]]是语法,其中为变量分配了值。为了进行比较,[/usr/bin/[)是命令,它要求var1,!=和var2是3个单独的参数。var1!= var2是单个参数。
anishsane 2012年

61

用于检查shell中的空字符串

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

要么

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

9
Shell的字符串相等运算符为=。这==是Shell编写者发明的一种非便携式黑客程序,目的是使年轻程序员的头脑混乱。
Jens

17

如果需要检查任意数量的空格,而不仅仅是单个空格,可以执行以下操作:

剥离一串多余的空格(也将中间的空格压缩为一个空格):

trimmed=`echo -- $original`

--确保如果$original包含交换机通过回声的理解,他们仍然被视为普通参数进行呼应。同样重要的是不要放在""周围$original,否则空格将不会被移除。

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

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

3
在bourne shell中,我以“-”作为修剪值。
Sridhar Sarnobat

根据这篇文章,echo不能解释-意味着选项的结束。在我的Bash shell中,我得到的结果与Sridhar Sarnobat
C先生

9

另一个快速测试字符串是否包含空格。

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

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

然后,在我们的案例空间中,前两个斜杠表示匹配以下所有内容。然后,第三个斜杠后跟替换(空)字符串,并用“}”结束。注意与通常的正则表达式语法不同。

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


和不[[ -n "$1" ]]一样[[ ! -z "$1" "]]
亚历山大·米尔斯

@AlexanderMills你是对的,使用-n会使它更短一些。我只是相应地更新了答案。
elomage


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

从字符串中删除所有换行符和空格将导致空白行减少为一无所知,可以测试并采取措施

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.