我该怎么办呢
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])已经完成时,set
s将是真的并且test -z "$var"
将是假的.
[fn0]:你永远不想在不引用变量的情况下使用test
(或[
).一个特别令人震惊的例子是,test -n $var
如果变量包含某些内容,并且它是list-empty/unset(根本没有set
或set var
没有参数),则返回true .这是因为fish test
是遵循POSIX的少数几个部分之一,并且要求test
任何一个参数都是真的.它也不能正确处理列表 - test -n $var
如果var有多个元素,则会产生奇怪的结果.
[fn1]:这是因为列表将通过使用空格连接元素而扩展为字符串,因此由两个空字符串组成的列表将扩展为"" - 一个空格.由于这不是空的,因此test -z
返回false.
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)
现代版本的fish shell(3.5.1)有string
命令。
string length --quiet $var
检查变量不为空not string length --quiet $var
检查变量是否为空