Je dois vérifier l'existence d'une variable dans une if
déclaration. Quelque chose à l'effet de:
if [ -v $somevar ]
then
echo "Variable somevar exists!"
else
echo "Variable somevar does not exist!"
Et la question la plus proche de celle-ci était celle-ci , qui ne répond pas réellement à ma question.
$somevar
une valeur / chaîne si variable n'existe pas:${somevar:=42}
.[ -n "$var" ]
ou[ ! -z "$var" ]
). Je pense que les vérifications d’existence / non-existence sont trop subtiles, et je préfère mon code grossier et simple.[ -n "$var" ]
? Connexes: stackoverflow.com/questions/3601515/…Réponses:
En bash moderne (version 4.2 et supérieure):
De
help test
:la source
[ -v name_of_var ]
.$1
,$-
,$#
...test
ou[
; Il n'est pas disponible dans/usr/bin/test
. Comparezman test
avechelp test
.Cela dépend de ce que vous voulez dire par existe .
Une variable déclarée mais non affectée existe- t-elle?
Est -ce une variable tableau (ou hachage) qui a été attribué une liste vide existe ?
Est -ce une variable nameref pointage à une variable qui n'est pas actuellement affectée existe ?
Considérez-vous
$-
,$#
, des$1
variables? (POSIX pas).Dans les coquilles de type Bourne, la manière canonique est la suivante:
Cela fonctionne pour les variables scalaires et d’autres paramètres pour indiquer si une valeur a été affectée à une variable (vide ou non, automatiquement, à partir de l’environnement, des affectations
read
,for
ou autre).Pour les shells ayant une commande
typeset
oudeclare
, les variables déclarées mais non affectées ne seront pas définies comme définies, sauf dans .zsh
Pour les shells qui prennent en charge les tableaux, à l'exception de
yash
etzsh
qui ne généreraient pas de variables de tableau définies , à moins que l'élément d'indice 0 ait été défini.Pour
bash
(mais nonksh93
pluszsh
), pour les variables de type tableau associatif , cela ne les indiquerait pas comme étant définies à moins que leur élément de la clé "0" ait été défini.Pour
ksh93
etbash
pour les variables de type nameref , cela ne renvoie true que si la variable référencée par nameref est elle-même considérée comme définie .Pour
ksh
,zsh
etbash
, une meilleure approche pourrait être:Pour
ksh93
,zsh
etbash
4.4 ou plus, il y a aussi:Ce qui rapportera les variables qui ont été définies ou déclarées.
la source
declare -p
/typeset -p
travaille dansbash
maintenant aussi.bash -c 'typeset -i a; typeset -p a'
comparer avecksh93
ouzsh
.Comme mentionné dans la réponse à SO , voici un moyen de vérifier:
où $ {somevar + x} est un paramètre de développement qui renvoie null si var est non défini et substitue la chaîne "x" sinon.
Utiliser
-n
, comme suggéré par l'autre réponse, ne vérifiera que si la variable contient une chaîne vide. Il ne vérifiera pas son existence.la source
$somevar
pour gérerIFS=x
. Soit ça ou citationx
.if [ -z "${somevar+x}" ]
? La citation serait-elle toujours requise à l'intérieur[[
et]]
?[ test
routines acceptent les paramètres de ligne de commande. Il convient donc de s’appuyer sur les développements et interprétations habituels, ordonnés de la manière habituelle, pour restituer, lors de l’appel du test appliqué, ce que vous devez faire en sorte que cette ligne de commande vous donne lecture. test {! + "!"}set -u
est en vigueur et que la version de Bash est antérieure à 4.2.POSIXly:
ou vous pouvez laisser votre shell afficher le message pour vous:
la source
trap
ne peut fonctionner que sur EXIT. C'est tout ce que je dis - cela ne s'applique tout simplement pas comme réussite / échec. Et ce n'est pas moi qui parle non plus - j'ai déjà fait exactement cela avant et il a fallu un petit commentaire comme ça pour me convaincre. Alors, j'ai juste pensé que je le payerais en avant.la source
sh
compatible, c'est exactement ce dont j'ai besoin.... n'imprimera rien du tout quand ce ne sera pas le cas. Ou...
... vous dira de toute façon.
vous pouvez utiliser la valeur de retour d'un test pour développer dynamiquement la chaîne de format appropriée pour votre condition:
Vous pouvez également faire
printf
échouer en fonction d'une substitution ...... qui imprime
$var does not exist!
sur stderr et renvoie une valeur autre que 0 lorsque$var
non défini, mais imprime$var does exist!
sur une sortie standard et renvoie 0 lorsque$var
est défini.la source
Cette simple ligne fonctionne (et fonctionne sur la plupart des shells POSIX):
Ou, écrit dans une forme plus longue:
L'expansion est:
L'
${var+"false"}
expansion se développe soit "null" de "false".Ensuite, "néant" ou "faux" est exécuté et le code de sortie défini.
Il n'est pas nécessaire d'appeler la commande
test
([
ou[[
) car la valeur de sortie est définie par (l'exécution de) l'extension elle-même.la source
$IFS
contient f, a, l, s ou e. Comme pour les autres réponses, il y a le cas des tableaux, des hachages ou d'autres types de variables que l'on peut vouloir mentionner.most POSIX shells
.most
signifieIn the greatest number of instances
, pas tous. ... ... Donc, oui, dans un état obscurwhen $IFS contains f, a, l, s or e
et pour une coquille obscure,some old versions of zsh
cela échoue: quel choc !. Je suppose que ce problème a été résolu il y a longtemps. ... ... Proposez-vous que nous devions écrire du code pour les coquilles cassées il y a longtemps?.Vous ne pouvez pas utiliser la
if
commande pour vérifier l'existence de variables déclarées dans bash, mais cette-v
option existe dans le plus récent bash, mais elle n'est pas portable et vous ne pouvez pas l'utiliser dans lesbash
versions antérieures . Parce que lorsque vous utilisez une variable si elle n’existe pas, elle naîtra au même moment.Par exemple, imaginez que je n'ai ni utilisé ni assigné de valeur à la
MYTEST
variable, mais lorsque vous utilisez la commande echo, elle ne vous indique rien! Ou si vous l'utilisezif [ -z $MYTEST ]
retourné valeur zéro! Il n'a pas renvoyé un autre statut de sortie, ce qui vous indique que cette variable n'existe pas!Maintenant vous avez deux solutions (sans
-v
option):declare
commande.set
commande.Par exemple:
Mais malheureusement, ces commandes vous indiquent également les fonctions chargées en mémoire! Vous pouvez utiliser la
declare -p | grep -q MYTEST ; echo $?
commande pour un résultat plus propre.la source
Fonction pour vérifier si la variable est déclarée / non définie
y compris vide
$array=()
En plus de la réponse de @ Gilles
- je n'ai pas trouvé le moyen de l'intégrer dans une fonction - j'aimerais ajouter une version simple, basée en partie sur la réponse de Richard Hansen , mais abordant également le piège qui se produit avec un vide :
array=()
$1
contient le nom d'un vide$array=()
, l'appel à déclarer nous assurerait d'obtenir le bon résultatAvec le code suivant, les fonctions peuvent être testées:
Le script devrait revenir
la source
fonction bash qui fonctionne à la fois pour les types scalaires et matriciels :
définition
invocation
la source
La manière de la coquille pure:
Script de test:
Résultats:
la source
Avec bash 4.4.19 ce qui suit a fonctionné pour moi. Voici un exemple complet
la source