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 -a
ouexport
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.