鱼壳。如何检查变量是否设置/空?

时间:2017-12-10 20:15:16

标签: shell fish

我该怎么做

set variable (some_command_that_may_return_a_string)
if [ variable is set ]
    do_something

反过来如何检查变量是否为空?

2 个答案:

答案 0 :(得分:30)

  • set -q var(请注意缺少" $" - 这使用变量 name )可用于检查是否已设置变量。

  • set -q var[1]可用于检查变量的第一个元素是否已被分配(即它是否为非空列表)。

  • test -n "$var" [fn0](或[ -n "$var" ])可用于检查变量是否扩展为非空字符串(test -z是反向的 - 如果它是空的。

在略有不同的情况下,这些将是真/假。

如果根本没有执行set var(并且尚未从父进程继承),则set -q varset -q var[1]test -n "$var"将为false,{ {1}}将是真的。

test -z "$var"之类的内容完成后(没有任何其他参数),set var将为真,set -q var将为false。

set -q var[1]之类的内容完成后,set var ""个版本都将为真。

set(或甚至set var "somestring" [fn1])之类的内容完成后,set var "" ""将为true,set将为false。

[fn0]:您从不想要在不引用变量的情况下使用test -z "$var"(或test)。一个特别令人震惊的例子是[如果变量包含某些内容,并且它是list-empty / unset(完全没有test -n $var或没有参数的set),则返回true。这是因为fish set var是遵循POSIX的少数几个部分之一,并且要求test与任何一个参数都为真。此外,它无法正确处理列表 - 如果var包含多个元素,test会产生奇怪的结果。

[fn1]:这是因为列表将通过用空格连接元素而扩展为字符串,因此由两个空字符串组成的列表将扩展为" " - 一个空间。由于这不是空的,test -n $var返回false。

答案 1 :(得分:0)

@faho 提供了一个很棒的答案,但我认为如果有代码示例会更容易。

function if-test-no-arg
  set var

  if set -q var
    # true
  end

  if set -q var[1]
    # false
  end

  # Always put quotation marks
  if test -n "$var"
    # false
  end

  if test -z "$var"
    # true
  end
end

function if-test-empty-arg
  set var ""

  if set -q var
    # true
  end

  if set -q var[1]
    # true
  end

  if test -n "$var"
    # false
  end

  if test -z "$var"
    # true
  end
end

function if-test-valid-arg
  set var "hello"

  if set -q var
    # true
  end

  if set -q var[1]
    # true
  end

  if test -n "$var"
    # true
  end

  if test -z "$var"
    # false
  end
end

function if-test-no-set
  if set -q var
    # false
  end

  if set -q var[1]
    # false
  end

  if test -n "$var"
    # false
  end

  if test -z "$var"
    # true
  end
end