Script Bash: $ x = $ x + 2 n’est pas reconnu

Lorsque j’exécute le script ci-dessous, j’obtiens l’erreur suivante: –
Le script s’exécute parfaitement et la ligne ci-dessous est imprimée à chaque fois. “ligne 9: 1 = 1 + 2: commande introuvable”. Pourquoi?

#!/bin/bash echo "Script 1 - Linux Scripting Book" x=1 while [ $x -le 45 ] do echo x : $x $x=$x+2 done echo "End Of Script 1" exit 0 

Aussi, si je change le $x=$x+2 à x+$x+2 alors je reçois aussi l’erreur ci-dessous.

 line 6: [: 1+2: integer expression expected 

Le même script, lorsqu’il est exécuté comme cela, fonctionne correctement.

 #!/bin/bash echo "Script 1 - Linux Scripting Book" x=1 while [ $x -le 45 ] do echo x : $x let x=x+2 done echo "End Of Script 1" exit 0 

Étant donné que cette partie de la question n’est pas encore effacée, et ne peut pas être publiée dans un commentaire, j’ajoute cette réponse partielle:

 x=1; for i in 1 2 3 ; do x=$x+2; echo $x; done 1+2 1+2+2 1+2+2+2 

Remarque: N’utilisez pas la sortie 0 à la fin de votre script sans une bonne raison. Lorsque le script est terminé, il se termine seul sans votre aide. Le statut de sortie sera le statut de sortie de la dernière commande effectuée, dans votre cas un simple écho, qui réussira presque toujours. Dans les rares cas, il échouera, vous aurez probablement sans intention de cacher cet échec.

Si vous générez le script, l’exit vous lancera hors de votre shell en cours d’exécution.

Mais vous pouvez réécrire votre boucle while comme ceci:

 x=0 while (($((x)) < 9)) do echo x : $x x=$x+2 done echo $((x)) x : 0 x : 0+2 x : 0+2+2 x : 0+2+2+2 x : 0+2+2+2+2 10 

Vous obtenez la line 9: 1=1+2: command not found car 1=1+2 est ce dans lequel $x=$x+2 est développé .

Utilisez expr ou let ou ((...)) pour les calculs entiers et bc pour les virgules flottantes:

 let x=x+2 ((x=x+2)) #same as above ((x+=2)) #same ((x++)) #if adding just one ((++x)) #if adding just one x=$((x+2)) x=`expr $x + 2` #space before and after + x=$(echo $x+2|bc) #using bc x=$(echo $x+2.1|bc) #bc also works with floating points (numbers with decimals) 

Parce que ce n’est pas la syntaxe du shell Bourne pour définir une variable; cela ressemble plus à Perl ou à PHP. $ Est utilisé pour l’ extension des parameters et ne fait pas partie du nom de la variable. L’ atsortingbution des variables utilise simplement = et let évalue les expressions arithmétiques (un peu comme $((expression)) ). Une autre syntaxe qui devrait fonctionner est x=$((x+2)) . Notez que ces évaluations arithmétiques sont une fonctionnalité bash; les shells unix standard peuvent nécessiter l’utilisation d’outils externes tels que expr .