Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

if

8 réponses
Avatar
Thomas
bonjour :-)

bash


apparemment je sais pas faire les if

j'essaye comme ça :
if [["$1"=='b']]; then

qu'est ce qui ne va pas ?

--
Téléassistance / Télémaintenance
http://www.portparallele.com/ThomasDECONTES/

8 réponses

Avatar
Cyrille Lefevre
Thomas a écrit :
bonjour :-)

bash


apparemment je sais pas faire les if

j'essaye comme ça :
if [["$1"=='b']]; then

qu'est ce qui ne va pas ?





Bonjour,

les espaces :

if [[ $1 == b ]]; then
^ ^ ^ ^

les variables n'ont pas besoin d'être protégées lorsqu'elles sont e ntre
double [[, par contre, il est très fortement conseillé de les proté gées
lorsqu'elles sont entre simple [.
idem pour les affectations (x=$y) mais pas pour les passages d'argument s
(foo "$bar").

Regards, Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.
Avatar
Thomas
In article ,
Cyrille Lefevre <cyrille.lefevre-news%
wrote:

Thomas a écrit :
> bonjour :-)
>
> bash
>
>
> apparemment je sais pas faire les if
>
> j'essaye comme ça :
> if [["$1"=='b']]; then
>
> qu'est ce qui ne va pas ?
>


Bonjour,

les espaces :

if [[ $1 == b ]]; then
^ ^ ^ ^



merci bcp :-)


les variables n'ont pas besoin d'être protégées lorsqu'elles sont entre
double [[, par contre, il est très fortement conseillé de les protégées
lorsqu'elles sont entre simple [.
idem pour les affectations (x=$y) mais pas pour les passages d'arguments
(foo "$bar").



je suis habitué à la programmation stricte (ada),
alors je préfère prendre l'habitude de mettre des guillemets partout et
les retirer quand c'est nécessaire :-)

pas d'objection ?

--
Téléassistance / Télémaintenance
http://www.portparallele.com/ThomasDECONTES/
Avatar
NicolasAlex.Michel.remove
Thomas wrote:

In article ,
Cyrille Lefevre <cyrille.lefevre-news%
wrote:

> Thomas a écrit :
> > bonjour :-)
> >
> > bash
> >
> >
> > apparemment je sais pas faire les if
> >
> > j'essaye comme ça :
> > if [["$1"=='b']]; then
> >
> > qu'est ce qui ne va pas ?
> >
>
>
> Bonjour,
>
> les espaces :
>
> if [[ $1 == b ]]; then
> ^ ^ ^ ^

merci bcp :-)



Les espaces, par défaut, sont des séparateurs.
(les séparateurs sont définits par la variable $IFS)

Ils sont nécessaires pour que le shell puisse lire chaque éléments
séparément. Sans eux il intérprète [["$1"=='b']] comme un seul "mot".

je suis habitué à la programmation stricte (ada),
alors je préfère prendre l'habitude de mettre des guillemets partout et
les retirer quand c'est nécessaire :-)

pas d'objection ?



pour b, il n'y aurait pas, en principe, besoins de guillemets.
en mettre ne sert à rien mais ne fais pas de mal et pourrait être
concidéré comme une bonne habitude.

Par contre avant d'exécuter le test, $1 est remplacé par sa valeur.
si $1 a une valeur nulle, ça fais une erreur :
$> [ = b ]
-bash: [: =: unary operator expected

Si le contennu de $1 contient un séparateur (par défaut un espace, un
tab ou un retour de chariot), ça fait aussi une erreur :
$> i='le chat'
$> [ $i = b ]
-bash: [: too many arguments

Donc les guillemets autour de $1 sont simplement nécessaires.

--
Nicolas Michel
Avatar
Thomas
In article <1j5cwyu.1cd2w5g186xp8N%,
(Nicolas Michel) wrote:

Thomas wrote:

> In article ,
> Cyrille Lefevre <cyrille.lefevre-news%
> wrote:
>
> > Thomas a écrit :
> > > bonjour :-)
> > >
> > > bash
> > >
> > >
> > > apparemment je sais pas faire les if
> > >
> > > j'essaye comme ça :
> > > if [["$1"=='b']]; then
> > >
> > > qu'est ce qui ne va pas ?
> > >
> >
> >
> > Bonjour,
> >
> > les espaces :
> >
> > if [[ $1 == b ]]; then
> > ^ ^ ^ ^
>
> merci bcp :-)

Les espaces, par défaut, sont des séparateurs.
(les séparateurs sont définits par la variable $IFS)

Ils sont nécessaires pour que le shell puisse lire chaque éléments
séparément. Sans eux il intérprète [["$1"=='b']] comme un seul "mot".

> je suis habitué à la programmation stricte (ada),
> alors je préfère prendre l'habitude de mettre des guillemets partout et
> les retirer quand c'est nécessaire :-)
>
> pas d'objection ?

pour b, il n'y aurait pas, en principe, besoins de guillemets.
en mettre ne sert à rien mais ne fais pas de mal et pourrait être
concidéré comme une bonne habitude.

Par contre avant d'exécuter le test, $1 est remplacé par sa valeur.
si $1 a une valeur nulle, ça fais une erreur :
$> [ = b ]
-bash: [: =: unary operator expected

Si le contennu de $1 contient un séparateur (par défaut un espace, un
tab ou un retour de chariot), ça fait aussi une erreur :
$> i='le chat'
$> [ $i = b ]
-bash: [: too many arguments

Donc les guillemets autour de $1 sont simplement nécessaires.



merci pour le complément d'info :-)


(j'ai pas encore saisi toutes les subtilités, mais il a précisé qu'il y
a une différence entre [[ et [ )

--
Téléassistance / Télémaintenance
http://www.portparallele.com/ThomasDECONTES/
Avatar
Cyrille Lefevre
Thomas a écrit :

(j'ai pas encore saisi toutes les subtilités, mais il a précisé q u'il y
a une différence entre [[ et [ )




Bonjour,

assez grande d'ailleurs, [ est, historiquement, un lien sur la commande t est.
par la suite, test a été intégré aux shells sous forme de "builti n".
[[ est un mot clé comme l'est if et fait parti de la syntaxe du shell.

le différence se situe ici :

test $x = 1
[ $x = 1 ]
[[ $x = 1 ]

dans les 2 premiers cas, le shell étend les variables, etc.
et appelle la commande (ou builtin) une fois les remplacements
effectués, ce qui donne, si x est vide : test = 1, ce qui est
erreur de syntaxe au sens test.
dans le cas de [[, $1 est remplacé par "", ce qui donne :
[[ "" = 1 ], et ne provoque pas d'erreur de syntaxe.
d'où la nécessité de toujours protéger les arguments avec de
simples [.
malheureusement, les [[ ne sont pas posix si je ne me trompe.

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Thomas
In article ,
Cyrille Lefevre <cyrille.lefevre-news%
wrote:

Thomas a écrit :
>
> (j'ai pas encore saisi toutes les subtilités, mais il a précisé qu'il y
> a une différence entre [[ et [ )
>

Bonjour,

assez grande d'ailleurs, [ est, historiquement, un lien sur la commande test.
par la suite, test a été intégré aux shells sous forme de "builtin".
[[ est un mot clé comme l'est if et fait parti de la syntaxe du shell.

le différence se situe ici :

test $x = 1
[ $x = 1 ]
[[ $x = 1 ]

dans les 2 premiers cas, le shell étend les variables, etc.
et appelle la commande (ou builtin) une fois les remplacements
effectués, ce qui donne, si x est vide : test = 1, ce qui est
erreur de syntaxe au sens test.
dans le cas de [[, $1 est remplacé par "", ce qui donne :
[[ "" = 1 ], et ne provoque pas d'erreur de syntaxe.
d'où la nécessité de toujours protéger les arguments avec de
simples [.
malheureusement, les [[ ne sont pas posix si je ne me trompe.



merci :-)

et à part ça, [ et [[ sont strictement équivalents ?
cad que
[ "$x" = 1 ]
et
[[ $x = 1 ]]
(un seul ] convient, pour fermer ?)
sont *strictement* équivalents ?

--
Téléassistance / Télémaintenance
http://www.portparallele.com/ThomasDECONTES/
Avatar
Ph. Ivaldi
Le 20 septembre 2009, Thomas écrivit :

et à part ça, [ et [[ sont strictement équivalents ?



Non:
8<------8<------8<------8<------8<------8<------8<------8<------8<------
[]$ [[ 0 > 1 ]];echo $?
1
[]$ [ 0 > 1 ];echo $?
0
[]$ [ 0 > 1 ];echo $?
1
8<------8<------8<------8<------8<------8<------8<------8<------8<------

D'après ce que j'ai compris, le contenu de [[]] est comme un
sous-langage.
--
Philippe Ivaldi.
http://www.piprime.fr/
Avatar
Cyrille Lefevre
Thomas a écrit :
et à part ça, [ et [[ sont strictement équivalents ?
cad que
[ "$x" = 1 ]
et
[[ $x = 1 ]]
(un seul ] convient, pour fermer ?)
sont *strictement* équivalents ?




Bonjour,

pas tout à fait, les [[ sont plus puissant que les simples [.

avec =, la 2ème opérande peut être une expression shell :

[[ " $PATH " = *" $ITEM "* ]] est équivalent, en plus concis, à :

case " $PATH " in
*" $ITEM "*) then part ;;
*) else part ;;
esac

le groupement des expressions est plus lisible à mon sens :

[[ ( $x = 0 && $y != 0 ) || ( $x != 0 || $y = 0 ) ]]

plutôt que

[ ( "$x" -eq 0 -a "$y" -ne 0 ) -o ( "$x" -ne 0 -o "$y" -eq 0 ) ]

ou

( [ "$x" -eq 0 ] && [ "$y" -ne 0 ] ) || ( [ "$x" -ne 0 ] || [ "$y" -eq 0 ] )

tel que préconisé par susv3/4 ! sont gentil là-bas...
j'espère que leur shell est optimisé pour non génération de fils inutile ?

on peut comparer une chaine de caractère à une autre via les symboles < ou >.

sous bash, il est même possible d'utiliser les expressions shell éten dues du ksh
si shopt -s extglob est positionné tel que :

[[ $f = ?(.)profile*(.bak) ]] qui reconnait dont les .profile, profile et idem.bak

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.