如何测试变量是否为空或仅包含空格?

如何测试变量是否为空或仅包含空格?

以下 bash 语法验证是否param不为空:

 [[ !  -z  $param  ]]

例如:

param=""
[[ !  -z  $param  ]] && echo "I am not zero"

没有输出,它很好。

但是当param除了一个(或多个)空格字符之外为空时,情况就不同了:

param=" " # one space
[[ !  -z  $param  ]] && echo "I am not zero"

输出“我不是零”。

如何更改测试以将仅包含空格字符的变量视为空?

答案1

首先,请注意-z测试明确用于:

字符串长度为零

也就是说,仅包含空格的字符串应该不是在 下为真-z,因为它的长度非零。

您想要的是使用以下命令从变量中删除空格模式替换参数扩展:

[[ -z "${param// }" ]]

这会扩展param变量并用任何内容替换模式的所有匹配项(一个空格),因此其中只有空格的字符串将扩展为空字符串。


其工作原理的实质内容是用替换${var/pattern/string}第一个最长的匹配。当以(如上所述)开始时,它会替换patternstringpattern/全部比赛。因为替换为空,所以我们可以省略最终值/string值:

${参数/模式/字符串}

图案被扩展以产生一个模式,就像文件名扩展一样。范围被扩展并且最长的匹配图案反对它的价值被替换为细绳。如果图案以 '/' 开头,所有匹配项图案被替换为细绳。通常只替换第一个匹配项。 ... 如果细绳为空,匹配图案被删除和/以下图案可以省略。

毕竟,我们最终${param// }删除了所有空格。

请注意,虽然存在于ksh(它的起源)和 中,zshbash该语法不是 POSIX,不应在sh脚本中使用。

答案2

检查字符串是否仅包含授权集中的字符的简单方法是测试是否存在未经授权的字符。因此,不是测试字符串是否仅包含空格,而是测试字符串是否包含空格以外的其他字符。在 bash、ksh 或 zsh 中:

if [[ $param = *[!\ ]* ]]; then
  echo "\$param contains characters other than space"
else
  echo "\$param consists of spaces only"
fi

“仅由空格组成”包括空(或未设置)变量的情况。

您可能想要测试任何空白字符。用于[[ $param = *[^[:space:]]* ]]使用区域设置,或任何您想要测试的空白字符的显式列表,例如[[ $param = *[$' \t\n']* ]]测试空格、制表符或换行符。

将字符串与=内部模式进行匹配[[ … ]]是 ksh 扩展(也存在于 bash 和 zsh 中)。在任何 Bourne/POSIX 风格中,您可以使用该case构造将字符串与模式进行匹配。请注意,标准 shell 模式用于!否定字符集,而不是^像大多数正则表达式语法那样。

case "$param" in
  *[!\ ]*) echo "\$param contains characters other than space";;
  *) echo "\$param consists of spaces only";;
esac

要测试空白字符,$'…'语法特定于 ksh/bash/zsh;您可以按字面意思在脚本中插入这些字符(请注意,换行符必须在引号内,因为反斜杠+换行符会扩展为空),或者生成它们,例如

whitespace=$(printf '\n\t ')
case "$param" in
  *[!$whitespace]*) echo "\$param contains non-whitespace characters";;
  *) echo "\$param consists of whitespace only";;
esac

答案3

POSIXly:

case $var in
  (*[![:blank:]]*) echo '$var contains non blank';;
  (*) echo '$var contains only blanks or is empty or unset'
esac

为了区分空白的,非空白,空的,未设置:

case ${var+x$var} in
  (x) echo empty;;
  ("") echo unset;;
  (x*[![:blank:]]*) echo non-blank;;
  (*) echo blank
esac

[:blank:]用于水平间距字符(ASCII 中的空格和制表符,但您的语言环境中可能还有更多;某些系统将包含不间断空格(如果可用),有些则不会)。如果您还需要垂直间距字符(例如换行符或换页符),请替换[:blank:][:space:].

答案4

if [[ -n "${variable_name/[ ]*\n/}" ]]
then
    #execute if the the variable is not empty and contains non space characters
else
    #execute if the variable is empty or contains only spaces
fi

相关内容