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
3 Réponses :
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. )
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
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
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.
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
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 pasdeclare -x,set -aouexportet 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.