我该怎么办呢
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(根本没有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检查变量是否为空| 归档时间: |
|
| 查看次数: |
6077 次 |
| 最近记录: |