Script bash : question

Dans la déclaration d’une variable texte, j’ai vu deux façons de la présenter, quelle est la bonne :question:
nom_variable=salut tout le monde
ou
nom_variable=‘salut tout le monde’

’ ou pas ’ :question:

Je parle bien de “déclaration” et de variable de “texte”

Re,

Méthode

nom_variable=salut tout le monde

bash: tout: command not found

Le shell n’est pas un langage déclaratif. Tu parle d’initialisation.
En fait la bonne solution ça dépend. :mrgreen:
Tu as trois forme :

var1=val var2="val" var3='val'
L’intérêt des guillemets simples ou doubles c’est de protéger certains caractères.
Je m’explique : Imaginons que tu veuille déclarer une variable var dont le contenu serais $salut. Pas le contenu d’une variable nommée salut. Donc si tu écris :

var=$salut var="$salut" var='$salut'
La première et la seconde forme sont identique (dans ce cas là) tu initialise $var avec le contenu de $salut, dans le troisième cas tu initialise var avec le texte « $salut ». On dis que le caractère $ a était protégé (il n’a pas était analysé comme d’habitude). Ça reviens à faire ça :

var=\$salut

Alors pour être plus précis je viens de regarder la doc. Donc :
[ul]
[li]var=textle texte est analysé les $, ! et espace par exemple[/li]
[li]var="text"tout les caractères spéciaux sont protégé sauf $, ’ et . L’exemple est au dessus.[/li]
[li]var='text'le texte n’est pas du tout analysé, tout ce qui est entre les ’ est pris tel quel[/li][/ul]

Mais je teins à remarquer que ça n’a rien avoir avec les initialisations ça sert dans d’autres cas par exemple si tu veut faire un ls :

ls $HOME/je suis là/

pose des problèmes à cause des espaces (ls pense devoir lire les répertoires « ~/je », « suis » et « là »)

ls "$HOME/je suis là/" ls $HOME/je\ suis\ là/
Les deux solutions fonctionnent. On protège les espaces et pas le $.

 ls '$HOME/je suis là/'

ne fonctionne pas on protège les espaces et le $

Ok, moi j’en étais resté au C où il faut tout déclarer.
J’ai bien compris les différences entre ’ ; " et rien.
Mais en fait, il y a bien “déclaration” la première fois qu’on utilise une variable , non ?

C’est ce que l’on appel une déclaration implicite.
Ça signifie que :

va aussi créer la variable avant de l’initialiser.
Mais il faut faire gaffe parce que ça :

si la variable $rep n’est pas déclarer, il va la déclarer, pas l’initialiser, donc la variable seras vide et tu fais un ls tout simple sans que ça te renvoie d’erreur.

Pour éviter ce genre d’erreurs, est-il bête de déclarer les variables avant :question:
Même si ça n’est pas indispensable, ça ne fait que rendre le prog plus explicite, non :question:

Ce sont des écoles ça se discute. Tu risque de garder des variables qui te servent plus au final, mais oui ça peut être plus propre.

Allez encore une question qui n’est pas très claire pour moi :
"Les variables de paramètres"
J’ai bien compris la façon de s’en servir : $# ; $0 ; $1 ; $2 ; etc.
Ce que je ne comprends pas c’est “où” elle sont indiquées avant d’être utilisées :question:

EDIT :
je viens de lire la réponse à ma question dans le cours de l’IUT de Rodez
"paramètres de position" avec la commande ‘set’.

Tu crée le fichier test.sh. De dans tu met :

[code]#!/bin/sh

echo "Il y a $# paramètres"
foreach $arg in $@ do
echo $arg
done;
echo $1[/code]

Puis test

./test.sh coucou ./test.sh coucouc c\'est moi

marchait mieux comme ça chez moi:

#!/bin/bash

echo "Il y a $# paramètres"
for arg in $@
do
   echo $arg
done
echo $1

:imp: :smt003
1 j’étais fatigué, 2 j’étais fatigué, 3 ça fait un baille que j’ai pas touché à du shell. :wink:

Sans juger le ‘foreach’, que je ne connais pas, mais que je comprends, ne manquerait-il pas un ‘;’ entre le $@ et le do :question:
foreach $arg in $@ do

Question 2 :
que veut dire : $@ :question:

Question 3 : peut-on tester un mini script sans avoir à le sauvegarder et le rendre exe :question:

[quote=“ricardo”]Sans juger le ‘foreach’, que je ne connais pas, mais que je comprends, ne manquerait-il pas un ‘;’ entre le $@ et le do :question:
foreach $arg in $@ do
[/quote]
oui. sauf que foreach ==> for à ma connaissance, et à celle de google.

$@ est un tableau ( ou une liste ) qui contient tous les arguments
(‘bonjour’,‘je’,‘m’appelle’,‘louis’)
donc après l’utilisation de la boucle for se comprend.

[quote=“ricardo”]
Question 3 : peut-on tester un mini script sans avoir à le sauvegarder et le rendre exe :question:[/quote]

hum, je ne pense pas, seulement pour le rendre executable:

Pour exécuter un script qui n’a pas les droits en exécution, tu peux le passer en argument à l’interpréteur :

Si tu n’as pas envie de travailler avec un fichier, tu peux simplement tapper dans le shell de la même manière que si tu ecrivais ton script dans ton fichier, tant que la commande est incomplète (par exemple tu commences par tapper “if true; then” et tu tappes entrée, tu vas à la ligne et tu peux continuer ta commandes. Si c’est une commande valide, et que tu veux que tout s’exécute en une fois, tu peux aussi mettre des ‘’ à la fin de ta ligne.

Enfin, tu peux passer ton texte de script en argument à bash :

$bash -c 'if true; the echo Good else echo Bad fi'

merci de tous ces renseignements :smt001

Salut,

Ma solution (fainéant).

Créer un fichier vide toto et le rendre exécutable.
S’en servir à chaque essai et ne le sauvegarder sous un nom digne de lui quand il en vaut la peine puis effacer le contenu de toto :slightly_smiling:

Il y a plusieurs technique, tu peut quand il n’y a pas d’argument dans la ligne de commande taper les commandes directement dans ton shell sans appeler directement bash.

Tu peut aussi l’enregistrer comme une fonction du shell.

Enfin selon l’éditeur de texte que tu as tu peut lui demander de rendre exécutable automatiquement tes nouveaux fichiers dont l’extension est sh.

Pour $@, c’est la liste des arguments du programme, il existe aussi $* qui a la même fonction sauf que si tu fais “$*” ça va être compris comme “$1 $2” alors que pour “$@” ça reviens à écrire “$1” “$2” …

merci de toutes ces précisions et encore une petite pour la route :wink: :
“différent de”, c’est ‘!’ ou ‘!=’ ou autre chose :question:
Pourquoi ils n’ont pas copié sur ‘C’ qui est quand même plus clair :
plus petit : <
plus grand : >
différent : <>
etc.

Re,

Parce que !< pas plus petit
!> pas plus grand

[quote=“ricardo”]merci de toutes ces précisions et encore une petite pour la route :wink: :
“différent de”, c’est ‘!’ ou ‘!=’ ou autre chose :question:
Pourquoi ils n’ont pas copié sur ‘C’ qui est quand même plus clair :
plus petit : <
plus grand : >
différent : <>
etc.[/quote]
! veut dire not
!= veut dire différent

Fait ausi attention :
dans test (alias [) = et != sont pour comparer les chaines de caractère,
pour les comparaisons arithmétiques c’est -eq, -ne, -gt etc…