4
votes

En coquille de poisson, comment définir une variable avec le repli par défaut?

Je recherche l'équivalent de la syntaxe bash suivante, mais pour la coquille de poisson:

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

c'est à dire définir une variable locale qui prendra la valeur de $ _Z_DATA si celui-ci est défini, ou bien prendra la valeur de $HOME/.z


1 commentaires

Les variables locales ne sont pas des variables d'environnement. Une variable "d'environnement" est une variable exportée pour être héritée même par des sous-processus qui ne sont pas des copies fork () éditées du shell actuel. Si vous n'utilisez pas declare -x , set -a ou export et qu'il n'y avait pas déjà quelque chose de marqué exporté avec le même name, une variable est juste une variable shell régulière, pas une variable d'environnement.


3 Réponses :


6
votes

Autant que je sache, il n'y a pas de syntaxe pour cela; vous avez besoin de quelque chose comme

if set -q _Z_DATA; and test -n _Z_DATA
  set datafile "$_Z_DATA"
else
  set datafile "$HOME/.z"
fi

ou

set datafile "$_Z_DATA"
test -z "$datafile"; and set datafile "$HOME/.z"

Contrairement à bash , les variables définies dans une fonction sont automatiquement locales à cette fonction, donc aucun équivalent à local n'est nécessaire. (Une version précédente de cette réponse utilisait l'option -l pour localiser la variable, mais cela la rend locale à tout bloc set dans lequel se trouve. )


2 commentaires

J'ai déjà essayé la deuxième méthode avec if else , mais malheureusement, la variable sort du champ d'application dès que vous quittez le bloc if (la deuxième méthode fonctionne bien cependant)


déposez le -l pour rendre la fonction de variable cadrée



1
votes

J'écrirais ceci comme suit:

function defaultset --no-scope-shadowing
    set -q $argv[1] || set $argv[1] $argv[2..-1]
end

# example usage
defaultset _Z_DATA $HOME/.z 

sur fish 3.0+, vous pouvez écrire:

set -q _Z_DATA || set _Z_DATA $HOME/.z

Si vous faites cela beaucoup, vous pourrait définir une fonction:

set -q _Z_DATA; or set _Z_DATA $HOME/.z


1 commentaires

Le bash d'origine ne définit pas la valeur de _Z_DATA ; il utilise une valeur préexistante pour définir datafile , ou $ HOME / .z si _ZDATA est vide ou non défini.



1
votes

Je ne suis pas du tout un expert du poisson, mais j'ai écrit une fonction d'aide pour cela:

set datafile (default "$Z_DATA" "$HOME/.z")

La fonction fait écho à la première valeur qui n'est pas vide. (Cela fonctionne aussi bien avec les nombres que les chaînes.)

~> set myfoo (default $foo "default")
~> echo $myfoo
default
~> set foo "the real foo"
~> set myfoo (default $foo "default")
~> echo $myfoo
the real foo

Pour l'utiliser dans votre script, vous pouvez appeler la fonction en utilisant la syntaxe des parenthèses:

~> set baz baz
~> default $foo $bar $baz $bat
baz
~> set bar bar
~> default $foo $bar $baz $bat
bar

Revenant à votre exemple spécifique:

function default
  for val in $argv
    if test "$val" != ""
      echo $val
      break
    end
  end
end


0 commentaires