在鱼壳中,如何设置具有默认回退的变量?

时间:2019-02-04 21:26:05

标签: environment-variables fish

我正在寻找以下bash语法的等效项,但要寻找鱼壳:

local datafile="${_Z_DATA:-$HOME/.z}"

即,定义一个局部变量,如果该变量已定义,则该变量将采用$_Z_DATA的值,否则将采用$HOME/.z的值

3 个答案:

答案 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")