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

Ada*_*ran 23 shell fish

我该怎么办呢

set variable (some_command_that_may_return_a_string)
if [ variable is set ]
    do_something
Run Code Online (Sandbox Code Playgroud)

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

fah*_*aho 34

  • set -q var(注意缺少的"$" - 这使用变量名称)可用于检查是否已设置变量.

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

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

在稍微不同的情况下,这些将是真/假.

如果没有set var执行任何操作(并且它没有从父进程继承)set -q var,set -q var[1]并且test -n "$var"将为false,test -z "$var"则为true.

set var已经完成的事情(没有任何额外的参数),set -q var将是真的,set -q var[1]将是假的.

set var ""完成类似的事情时,两个set版本都将成立.

当某些事情set var "somestring"(甚至set var "" ""[fn1])已经完成时,sets将是真的并且test -z "$var"将是假的.


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

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

  • 就像 shellscript 中的所有内容一样,“if”然后是内容。因此 `if set -q var[1]`、`if test -n "$var"` 等等。`if` 不接受条件,而是调用命令,并使用其退出状态。 (2认同)

San*_*Lee 16

@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
Run Code Online (Sandbox Code Playgroud)


Val*_*sky 5

现代版本的fish shell(3.5.1)有string命令。

  • string length --quiet $var检查变量不为空
  • not string length --quiet $var检查变量是否为空