我该怎么做
set variable (some_command_that_may_return_a_string)
if [ variable is set ]
do_something
反过来如何检查变量是否为空?
答案 0 :(得分:30)
set -q var
(请注意缺少" $" - 这使用变量 name )可用于检查是否已设置变量。
set -q var[1]
可用于检查变量的第一个元素是否已被分配(即它是否为非空列表)。
test -n "$var"
[fn0](或[ -n "$var" ]
)可用于检查变量是否扩展为非空字符串(test -z
是反向的 - 如果它是空的。
在略有不同的情况下,这些将是真/假。
如果根本没有执行set var
(并且尚未从父进程继承),则set -q var
,set -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