J'ai essayé de comprendre ce qui ne va pas, mais je ne peux tout simplement pas le comprendre ..
C'est la partie qui semble recevoir une erreur.
elif [ $operation = "man" ]; then
if [ $aug1 = "add" ]; then # <- Line 75
echo "Man Page for: add"
echo ""
echo "Syntax: add [number 1] [number 2]"
echo ""
echo "Description:"
echo "Add two different numbers together."
echo ""
echo "Info:"
echo "Added in v1.0"
echo ""
elif [ -z $aug1 ]; then
echo "Please specify a command to read the man page."
else
echo "There is no manual page for that command."
fi
Je reçois cette erreur:
calc_1.2: line 75: [: =: unary operator expected
if
déclaration à la ligne 75 a besoin d'unfi
.Réponses:
Si vous savez que vous allez toujours utiliser bash, il est beaucoup plus facile d'utiliser toujours la commande composée conditionnelle à double crochet
[[ ... ]]
, au lieu de la version à support simple compatible Posix[ ... ]
. À l'intérieur d'un[[ ... ]]
composé, le fractionnement de mots et l'expansion des noms de chemin ne sont pas appliqués aux mots, vous pouvez donc vous fier àpour comparer la valeur de
$aug1
avec la chaîneand
.Si vous utilisez
[ ... ]
, vous devez toujours vous rappeler de doubler les variables comme ceci:Si vous ne citez pas l'expansion de la variable et que la variable est indéfinie ou vide, elle disparaît de la scène du crime, ne laissant que
qui n'est pas une syntaxe valide. (Il échouerait également avec un message d'erreur différent s'il
$aug1
incluait des espaces blancs ou des métacaractères shell.)L'
[[
opérateur moderne possède de nombreuses autres fonctionnalités intéressantes, notamment la correspondance d'expressions régulières.la source
Cela m'a pris un certain temps pour trouver cela, mais notez que si vous avez une erreur d'espacement, vous obtiendrez également la même erreur:
Correct:
contre
Comme toujours
-x
variable de débogage aide à les trouver:la source
Essayez d'affecter une valeur à
$aug1
avant de l'utiliser dans desif[]
instructions; le message d'erreur disparaîtra ensuite.la source
tu dis ... :
je pense que c'est juste l'espace ... fais comme ça:
la source
Vous pouvez également définir une valeur par défaut pour la variable, vous n'avez donc pas besoin d'utiliser deux "[", ce qui équivaut à deux processus ("[" est en fait un programme) au lieu d'un.
Il passe par cette syntaxe: $ {VARIABLE: -default}.
Le tout doit être pensé de telle manière que cette valeur "par défaut" soit quelque chose de distinct d'une valeur / contenu "valide".
Si ce n'est pas possible pour une raison quelconque, vous devrez probablement ajouter une étape comme la vérification de la présence d'une valeur, dans le sens de "if [-z $ VARIABLE]; alors echo" la variable doit être remplie "", ou " si [! -z $ VARIABLE]; alors #tout va bien, continuez avec le reste du script ".
la source
[[
ne génère pas deux processus, il s'agit d'un shell intégré (et[
est également intégré à Bash).[[
est différent de[ [
, qui traite le second[
comme une chaîne