【问题标题】:Check if string is neither empty nor space in shell script检查shell脚本中的字符串是否既不是空也不是空格
【发布时间】:2012-11-10 15:54:59
【问题描述】:

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

【问题讨论】:

  • 空字符串在shell脚本中被称为空字符串吗?

标签: bash shell freebsd


【解决方案1】:

!= 的两边都需要一个空格。将您的代码更改为:

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

【讨论】:

  • 非常感谢,它有效。但我想知道为什么分配不使用空格而比较使用。
  • ^^这是语法。命令行上的第一个单词是命令,后面的单词是参数。 var=value [command [args]] 是一种语法,其中变量被赋值。为了比较,[ (/usr/bin/[) 是命令,它要求 var1、!= 和 var2 是 3 个单独的参数。 var1!=var2 是单个参数。
【解决方案2】:

用于检查 shell 中的空字符串

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

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

【讨论】:

  • shell 的字符串相等运算符是=== 是 shell 作者发明的一种不可移植的 hack,目的是扰乱年轻程序员的思想。
【解决方案3】:

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

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

trimmed=`echo -- $original`

-- 确保如果$original 包含回显可以理解的开关,它们仍将被视为要回显的普通参数。另外重要的是不要将"" 放在$original 周围,否则空格不会被删除。

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

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

【讨论】:

  • 在 bourne shell 中,我以 "--" 作为 trimmed 的值。
  • 根据this post,echo 不解释 -- 表示选项的结束。在我的 Bash shell 中,我得到了与 Sridhar Sarnobat 相同的结果
【解决方案4】:

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

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

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

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

您可以阅读有关string manipulation in bash shell scripting here 的更多信息。

【讨论】:

  • 不是[[ -n "$1" ]][[ ! -z "$1" "]] 一样吗?
  • @AlexanderMills 你是对的,使用 -n 会使它更短一些。我刚刚相应地更新了答案。
【解决方案5】:

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

shopt -s extglob  # more powerful pattern matching

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

请参阅 Bash 手册中的 Shell Parameter ExpansionPattern Matching

【讨论】:

    【解决方案6】:
    [ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"
    

    从字符串中删除所有换行符和空格将导致空白的减少到可以测试和操作的空值

    【讨论】:

    • 我认为 sed 命令中缺少 g 标志,以更改 所有 出现:[ $(echo $variable_to_test | sed s/\n//g | sed s/\ //g) == "" ] && echo "String is empty"
    猜你喜欢
    • 2013-05-13
    • 2016-05-15
    • 2017-08-19
    • 2010-12-16
    • 2014-08-03
    • 2011-04-05
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多