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
: 非空白字符。
如果您希望它可以移植到非 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 中工作。
在 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
: 非空白字符。
如果您希望它可以移植到非 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 中工作。