function foo {
(cd $FOOBAR;
<some command>
if [$? -ne 0]
then
echo "Nope!"
else
echo "OK!"
fi
)
}
J'essaie d'écrire une fonction comme celle ci-dessus et de la placer dans mon fichier .bashrc. Après avoir source le fichier et exécuté, j'obtiens:
Temps total: 51 secondes
-bash: [1: commande introuvable
OK!
Quelqu'un peut-il m'aider à comprendre ce que j'ai fait de mal?
$?
est égal à 0 avec uneif
instruction est inutile,if
attend une commande et si cette commande revient0
, il exécute le code dans le bloc. ainsiif true; then echo hello; fi
fera écho bonjour depuis letrue
retour de la commande0
.$?
contient le statut du dernier pipeline , qui n'est pas la commandetest
([
) dans l'if
instruction. L'exemple teste lasome command
réussite. Vous pouvez faire de même avec&&
et||
, mais cela peut faire de longues lignes illisibles par rapport àif [ $? -eq 0 ]
. Le même argument vaut pourif some command
$?
développe, je souligne qu'il n'y a aucun intérêt àtest
être utilisé; carif some command
fait la même chose avec une seule instruction par rapport à deux instructions distinctes. si la commande est déjà longue, l'ajout de trois caractères supplémentaires ne rendrait pas «illisible» terriblement plus «illisible».Réponses:
Ajoutez un espace après le
[
, et un autre avant]
:[
est une commande du shell, il est une commande commeecho
,read
,expr
... il a besoin d' un espace après, et nécessite une correspondance]
.L' écriture
[ $? -ne 0 ]
est en fait invoquaient[
et lui donner 4 paramètres:$?
,-ne
,0
et]
.Remarque: le fait que vous obteniez une erreur en disant
[1: command not found
que cela$?
avait la valeur de1
.la source
[
est un lien verstest
aussi bien[
est un shell intégré, et le/usr/bin/[
est rarement utilisé.Ou vous pouvez sauter
$?
complètement. Si votre commande estcmd
, les éléments suivants devraient fonctionner:la source
Il est recommandé d'affecter la valeur de retour à une variable avant de l'utiliser
Il vous permet de réutiliser la valeur de retour. par exemple dans une instruction if ... elif ... else ....
la source
[
(Sans l'espace, cela devient une erreur de syntaxe dansbash
) Annulera si vous modifiez et corrigez votre erreur.$?
directement parce que ça casse si jamais, lors de l'édition du script plus tard, mettez une ligne entre la commande et la$?
vérification.La seule raison pour laquelle vous souhaitez utiliser
$?
comme arguments d'une[
commande (que cette[
commande soit exécutée dans la partie condition d'uneif
instruction ou non) est lorsque vous souhaitez discriminer sur un état de retour spécifique, comme:La syntaxe pour tous ceux
if
,while
,until
... des déclarations estQui s'exécute en
cmd-list2
cas decmd-list1
succès oucmd-list3
non.La
[ "$?" -eq 0 ]
commande est un no-op. Il est défini$?
sur 0 si$?
est$?
égal à 0 et sur non nul s'il était différent de zéro.Si vous voulez exécuter quelque chose en cas d'
cmd
échec, c'est:Généralement, vous n'avez pas besoin de bricoler et
$?
encore moins de savoir quelle valeur signifietrue
oufalse
. Les seuls cas sont comme je l'ai dit ci-dessus si vous devez discriminer sur une valeur spécifique, ou si vous devez l'enregistrer pour plus tard (par exemple pour la retourner comme valeur de retour d'une fonction) comme:Souvenez-vous également que laisser une variable sans guillemets est l'opérateur split + glob. Cela n'a aucun sens d'invoquer cet opérateur ici, donc ça devrait être:
pas
, et encore moins[ $? -ne 0 ]
(qui n'appellerait la[$? -ne 0 ]
[
commande que s'il$IFS
contenait le premier caractère de$?
).Notez également que la manière Bourne de définir une fonction est de rester
function-name()
devant une commande. C'est le cas dans tous les shell Bourne like saufbash
etyash
(et les versions récentes deposh
) qui n'autorisent qu'une commande composée (les commandes composées étant{...}
ou(...)
ou des choses commefor...done
,if...fi
...function foo { ... }
est laksh
syntaxe de définition de fonction. Il n'y a aucune raison pour que vous souhaitiez l'utiliser ici.Votre code peut être écrit de manière portable (POSIX):
Notez également que
cd
sans-P
a une signification très spéciale (gère les chemins qui contiennent des..
composants différemment de toute autre commande), il est donc préférable de l'inclure dans les scripts pour éviter les confusions.(cette fonction renvoie en
false
cas d'cd
échec, mais pas en cas d'<some command>
échec).la source
Je crois que la commande ci-dessous fera tout ce que vous voulez en une seule ligne.
la source