我正在寻找以下bash语法的等效项,但要寻找鱼壳:
local datafile="${_Z_DATA:-$HOME/.z}"
即,定义一个局部变量,如果该变量已定义,则该变量将采用$_Z_DATA
的值,否则将采用$HOME/.z
的值
答案 0 :(得分:5)
据我所知,没有语法。您需要类似的东西
set datafile "$_Z_DATA"
test -z "$datafile"; and set datafile "$HOME/.z"
或
if set -q _Z_DATA; and test -n _Z_DATA
set datafile "$_Z_DATA"
else
set datafile "$HOME/.z"
fi
与bash
不同,在函数内部定义的变量是该函数自动本地的,因此不需要等效于local
。 (此答案的先前版本使用-l
选项对变量进行本地化,但这使其对于出现在其中的任何 block set
都是本地的。)
答案 1 :(得分:0)
我会这样写:
set -q _Z_DATA; or set _Z_DATA $HOME/.z
在fish 3.0+上,您可以编写:
set -q _Z_DATA || set _Z_DATA $HOME/.z
如果您经常这样做,则可以定义一个函数:
function defaultset --no-scope-shadowing
set -q $argv[1] || set $argv[1] $argv[2..-1]
end
# example usage
defaultset _Z_DATA $HOME/.z
答案 2 :(得分:0)
我根本不是鱼类专家,但是我为此编写了一个辅助函数:
function default
for val in $argv
if test "$val" != ""
echo $val
break
end
end
end
该函数回显不为空的第一个值。 (它也适用于数字和字符串。)
~> set baz baz
~> default $foo $bar $baz $bat
baz
~> set bar bar
~> default $foo $bar $baz $bat
bar
要在脚本中使用,可以使用括号语法调用该函数:
~> set myfoo (default $foo "default")
~> echo $myfoo
default
~> set foo "the real foo"
~> set myfoo (default $foo "default")
~> echo $myfoo
the real foo
回到您的具体示例:
set datafile (default "$Z_DATA" "$HOME/.z")