我该怎么做
set variable (some_command_that_may_return_a_string)
if [ variable is set ]
do_something
相反,我如何检查变量是否为空?
最佳答案
set -q var
(注意缺少的“$” - 它使用变量名)可用于检查是否已设置变量。 set -q var[1]
可用于检查变量的第一个元素是否已分配(即它是否作为列表非空)。 test -n "$var"
[fn0] (或 [ -n "$var" ]
)可用于检查变量是否扩展为非空字符串(而 test -z
是相反的 - 如果为空则为真)。 在稍微不同的情况下,这些将是真/假。
当没有
set var
已完全执行(且未从父进程继承),set -q var
, set -q var[1]
和 test -n "$var"
会是假的,test -z "$var"
会是真的。当类似
set var
已经完成(没有任何额外的参数),set -q var
会是真的,set -q var[1]
会是假的。当类似
set var ""
已经搞定,都set
版本将是真实的。当类似
set var "somestring"
(甚至 set var "" ""
[fn1])已经完成,set
s 为真,test -z "$var"
会是假的。[fn0]:你永远不想使用
test
(或 [
)而不引用变量。一个特别令人震惊的例子是 test -n $var
如果变量包含某些内容并且列表为空/未设置(根本没有 set
或没有参数的 set var
),都将返回 true。这是因为 fish 的test
是少数遵循 POSIX 的部分之一,这要求 test
任何一个论点都是真的。它也不能正确处理列表 - test -n $var
如果 var 有多个元素,将会产生奇怪的结果。[fn1]:这是因为一个列表会通过用空格连接元素来扩展为字符串,因此由两个空字符串组成的列表将扩展为“” - 一个空格。因为那不是空的,
test -z
返回假。
关于shell - fish shell 。如何检查变量是否设置/为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47743015/