Bash 零长度字符串或带空格的函数

Bash function for zero length string or with whitespace

在 bash 中,我可以使用 -z string-n string 来查看字符串长度是否为零。 想写一个 bash 函数 returns true 或 false,不仅如果长度为零,而且如果它全是空白。或者有没有不需要函数的方法?

您可以使用正则表达式:

if [[ $string =~ ^" "*$ ]]

或者您可以在使用 -z:

进行测试之前删除所有空格
if [[ -z "${string// /}" ]]

使用grep -Pq '\S'的退出状态,如果至少有1个非空白字符则为true,否则为false

grep -Pq '\S' <<< " " && echo "not all whitespace" || echo "all whitespace"
# all whitespace

grep -Pq '\S' <<< "" && echo "not all whitespace" || echo "all whitespace" 
# all whitespace

grep -Pq '\S' <<< "a" && echo "not all whitespace" || echo "all whitespace"
# not all whitespace

此处,GNU grep 使用以下选项:
-P : 使用 Perl 正则表达式。
-q:安静;不要向标准输出写入任何内容。如果找到任何匹配项,立即以零状态退出。

\S : 非空白字符。

另请参见:
grep manual
perlre - Perl regular expressions

如果您希望它可以移植到非 bash shells(例如 dash,它是某些 Linux 发行版的默认 /bin/sh),您可以使用这个:

if [ "$variable" = "${variable#*[![:space:]]}" ]; then

说明:${variable%pattern}将从变量值的开头删除模式的匹配项如果存在这样的匹配项。模式 *[![:space:]] 将从字符串的开头匹配到第一个非 space 字符( 如果 中有任何非 space 字符字符串)。因此,如果至少有一个非 space 字符,模式将匹配并且变量的值将更改,因此 = 测试将失败。另一方面,如果字符串不包含任何非 space 字符,模式将不匹配,变量将不会被修改,并且 = 测试将成功。

为了完整起见,您还可以使用 case

case "$variable" in
    *[![:space:]]* ) echo "variable is NOT empty" ;;
    * ) echo "variable IS empty" ;;
esac

这些中的任何一个都应该在任何符合 POSIX 的 shell 中工作。