我正在寻找与以下bash语法等效的fish shell语法:
即定义一个本地变量,如果定义了
local datafile="${_Z_DATA:-$HOME/.z}"
即定义一个本地变量,如果定义了
$_Z_DATA
,则该变量将取其值,否则将取$HOME/.z
的值。local datafile="${_Z_DATA:-$HOME/.z}"
$_Z_DATA
,则该变量将取其值,否则将取$HOME/.z
的值。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
选项来将变量局部化,但这会使它成为 set
命令所在的任何块的本地变量。)
if else
方法,但不幸的是,变量在退出if
块时就超出了作用域(尽管第二种方法运行良好)。 - Nicolas C-l
以使变量具有函数作用域。 - ridiculous_fish我会这样写:
set -q _Z_DATA; or set _Z_DATA $HOME/.z
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
bash
不会设置_Z_DATA
的值;它使用一个预先存在的值来设置datafile
,或者如果_ZDATA
为空或未定义,则使用$HOME/.z
。 - chepner我并不是一个鱼类专家,但我写了一个辅助函数:
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")
if test -n "$value"
。 - Pysis
fork()
子进程继承。如果您不使用declare -x
,set -a
或export
,并且没有已经标记为相同名称的导出内容,则变量只是常规shell变量,而不是环境变量。 - Charles Duffy