Cela fonctionne sur une invite shell (bash, dash):
[ -z "" ] && echo A || echo B
A
Cependant, j'essaie d'écrire un script shell POSIX , cela commence comme ceci:
#!/bin/sh
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
readonly raw_input_string=${1}
[ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1
Et je ne sais pas pourquoi, mais je ne reçois pas le message :
L'argument donné est vide.
si j'appelle le script comme ceci:
./test_empty_argument ""
Pourquoi donc?
shell-script
arguments
LinuxSecurityFreak
la source
la source
if [ X”” = X”$var” ] ; then echo isempty ; fi
[ "" = "$var" ]
fonctionnerait bien; une chaîne vide entre guillemets ne sera pas supprimée de la liste d'arguments de[
. Mais ce n'est pas nécessaire non plus, car cela fonctionne[ -z "$var" ]
aussi très bien.Réponses:
Notez que votre ligne
c'est la même chose que
(un caractère non cité
;
peut, dans la plupart des cas, être remplacé par un caractère de nouvelle ligne)Cela signifie que l'
exit 1
instruction est toujours exécutée quel que soit le nombre d'arguments transmis au script. Cela signifie à son tour que le messageThe given argument is empty.
n'aura jamais de chance d'être imprimé.Pour exécuter plusieurs instructions après un test utilisant la "syntaxe de court-circuit", regroupez les instructions dans
{ ...; }
. L'alternative consiste à utiliser uneif
déclaration appropriée (qui, à mon humble avis, semble plus propre dans un script):Vous avez le même problème avec votre deuxième test.
En ce qui concerne
Cela fonctionnerait pour l'exemple donné, mais le générique
ne serait pas le même que
Au lieu de cela, cela ressemble plus à
ou
Autrement dit, si le test ou la première commande échoue, la deuxième commande s'exécute, ce qui signifie qu'elle a le potentiel pour exécuter les trois instructions impliquées.
la source
Cette:
n'est pas:
Mais c'est plutôt:
Votre script se termine quel que soit le nombre d'arguments que vous lui avez transmis.
la source
Une façon de le rendre plus lisible est de définir une
die
fonction (à laperl
) comme:Vous pouvez ajouter plus de cloches et de sifflets comme les couleurs, le préfixe, le numéro de ligne ... si besoin est.
la source
die
fonction avec plusieurs arguments? (Si c'est le cas, pouvez-vous donner un exemple?) J'utilise unedie
fonction presque identique , mais j'utilise à la"$*"
place, ce qui peut être plus ce que vous envisagez?"$@"
est qu'il autorise les messages sur plusieurs lignes sans avoir besoin d'ajouter de nouvelles lignes littérales."$*"
pour joindre des arguments avec des espaces signifie également que vous devez définir$IFS
SPC pour qu'il fonctionne dans tous les contextes, y compris ceux où il$IFS
a été modifié. Alternativement avecksh
/zsh
, vous pouvez utiliserprint -r -- "$@"
ouecho -E - "$@"
danszsh
.die
fonction de type. Ce que je demande, c'est: dans la pratique, avez-vous déjà vu quelqu'un écriredie "unable to blah:" "some error"
, dans le but d'obtenir un message d'erreur de 2 lignes?die() { IFS=" "; printf >&2 "%s\n" "$*"; exit 1; }
. Avez-vous déjà personnellement utilisé ce type dedie
fonction pourprintf
générer un message d'erreur multiligne en passant plusieurs arguments? Ou ne passez-vous jamais qu'un seul argument àdie
afin qu'il n'ajoute qu'une seule nouvelle ligne à sa sortie?J'ai souvent vu cela comme un test pour une chaîne vide:
la source
-a
,-o
,(
et)
que derectives à diretest
de combiner plusieurs opérations en une seule invocation sont évités; voir les marqueurs OB dans pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html )./bin/sh
, et le prédécesseur immédiat de Heirloom Bourne) ne l'avait pas non plus.