在Bash中测试非零长度字符串:[ - n“$ var”]或[“$ var”]

时间:2010-10-06 02:12:06

标签: bash shell if-statement syntax

我看过bash脚本以两种不同的方式测试非零长度字符串。大多数脚本使用-n选项:

#!/bin/bash
# With the -n option
if [ -n "$var" ]; then
  # Do something when var is non-zero length
fi

但实际上并不需要-n选项:

# Without the -n option
if [ "$var" ]; then
  # Do something when var is non-zero length
fi

哪种方式更好?

同样,这是测试零长度的更好方法:

if [ -z "$var" ]; then
  # Do something when var is zero-length
fi

if [ ! "$var" ]; then
  # Do something when var is zero-length
fi

6 个答案:

答案 0 :(得分:343)

修改:这是一个更完整的版本,显示 [ (又名test)和 {{1}之间的更多差异}}

下表显示变量是否被引用,是否使用单括号或双括号以及变量是否仅包含空格是影响使用带有或不带[[的测试是否合适的因素用于检查变量。

-n/-z

如果您想知道变量的长度是否为非零,请执行以下任一操作:

  • 在单括号中引用变量(第2a列)
  • 使用 1a 2a 3a 4a 5a 6a |1b 2b 3b 4b 5b 6b [ [" [-n [-n" [-z [-z" |[[ [[" [[-n [[-n" [[-z [[-z" unset: false false true false true true |false false false false true true null : false false true false true true |false false false false true true space: false true true true true false |true true true true false false zero : true true true true false false |true true true true false false digit: true true true true false false |true true true true false false char : true true true true false false |true true true true false false hyphn: true true true true false false |true true true true false false two : -err- true -err- true -err- false |true true true true false false part : -err- true -err- true -err- false |true true true true false false Tstr : true true -err- true -err- false |true true true true false false Fsym : false true -err- true -err- false |true true true true false false T= : true true -err- true -err- false |true true true true false false F= : false true -err- true -err- false |true true true true false false T!= : true true -err- true -err- false |true true true true false false F!= : false true -err- true -err- false |true true true true false false Teq : true true -err- true -err- false |true true true true false false Feq : false true -err- true -err- false |true true true true false false Tne : true true -err- true -err- false |true true true true false false Fne : false true -err- true -err- false |true true true true false false 并在单括号中引用变量(第4a列)
  • 使用带或不带引号的双括号,有或没有-n(第1b - 4b列)

请注意,从第1a列开始,标记为“2”的行开始,结果表明-n正在评估变量的内容,就好像它们是条件表达式的一部分一样(结果与描述栏中“T”或“F”隐含的断言相匹配。当使用[时(第1b列),变量内容被视为字符串而不进行评估。

列3a和5a中的错误是由变量值包含空格而变量未加引号的事实引起的。同样,如第3b和5b行所示,[[将变量的内容评估为字符串。

如果你正在使用[[,那么确保你没有得到意外结果的关键是引用变量。使用[,无所谓。

正在被抑制的错误消息是“预期的一元运算符”或“预期的二元运算符”。

这是产生上表的脚本。

[[

答案 1 :(得分:11)

就Bash而言,最好使用more powerful [[

通常情况

if [[ $var ]]; then   # var is set and it is not empty
if [[ ! $var ]]; then # var is not set or it is set to an empty string

以上两种结构看起来干净可读。在大多数情况下,它们应该足够了。

请注意,我们不需要在[[内引用变量扩展,因为word splittingglobbing没有危险。

为防止shellcheck[[ $var ]][[ ! $var ]]的轻微抱怨,我们可以使用-n选项。

罕见案例

在极少数情况下,我们必须区分"设置为空字符串" vs"根本没有设置",我们可以使用这些:

if [[ ${var+x} ]]; then           # var is set but it could be empty
if [[ ! ${var+x} ]]; then         # var is not set
if [[ ${var+x} && ! $var ]]; then # var is set and is empty

我们也可以使用-v测试:

if [[ -v var ]]; then             # var is set but it could be empty
if [[ ! -v var ]]; then           # var is not set
if [[ -v var && ! $var ]]; then   # var is set and is empty
if [[ -v var && -z $var ]]; then  # var is set and is empty

相关帖子和文档

有很多与此主题相关的帖子。以下是一些:

答案 2 :(得分:8)

以下是一些更多的测试

如果字符串不为空,则为真:

[ -n "$var" ]
[[ -n $var ]]
test -n "$var"
[ "$var" ]
[[ $var ]]
(( ${#var} ))
let ${#var}
test "$var"

如果字符串为空,则为true:

[ -z "$var" ]
[[ -z $var ]]
test -z "$var"
! [ "$var" ]
! [[ $var ]]
! (( ${#var} ))
! let ${#var}
! test "$var"

答案 3 :(得分:1)

使用case/esac来测试

case "$var" in
  "") echo "zero length";;
esac

答案 4 :(得分:0)

评估空env变量的另一种可能更透明的方法是使用...

  if [ "x$ENV_VARIABLE" != "x" ] ; then
      echo 'ENV_VARIABLE contains something'
  fi

答案 5 :(得分:0)

正确答案如下:

meta_op

请注意使用if [[ -n $var ]] ; then blah fi ,它正确处理为您引用变量。