L'option -a dans une condition en bash

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Selon ce qu’affirme mon cours, l’option -a en bash permet d’assembler deux conditions avec un « et » logique :

Les expressions entre crochets peuvent également contenir un ! (négation). Finalement, des expressions logiques peuvent être groupées par des parenthèses précédées d’un backslash, et connectées par des -a (AND) et des -o (OR).

Je ne comprends pas pourquoi mon code ne fonctionne pas :

#!/bin/bash

cut_str='mon premier test'
i='0'

while [ \(-n ${cut_str}) -a \($i -lt '99') ]; do
    echo ${cut_str%% *}
    cut_str=${cut_str#* }
    let 'i += 1'
done

echo 'i : ' $i

./script.sh: ligne 6: erreur de syntaxe près du symbole inattendu « ) »
./script.sh: ligne 6: while [ \(-n ${cut_str}) -a \($i -lt '99') ]; do

Tes parenthèses fermantes ne sont pas précédées d’un backslash contrairement aux ouvrantes. Tu dois les ajouter des deux côté. ;)

Renault

Merci ! :)
Il me reste encore une petite erreur :

./script.sh: ligne 6 : [: trop d'arguments
i : 0

#!/bin/bash

cut_str='mon premier test'
i='0'

while [ \(-n ${cut_str}\) -a \($i -lt '99'\) ]; do
    echo ${cut_str%% *}
    cut_str=${cut_str#* }
    let 'i += 1'
done

echo 'i : ' $i

Bon à parement, la commande test simple (celle qui possède le -a) ne comprends que les chaînes de caractères. Du coup, il doit merder quand il compare ton $i à 9. En réécrivant a condition comme ça:

[ -n "${cut_str}" -a "$i" -lt "9" ]

ça fonctionne.

Et puis d’après le manuel de test:

NOTE: Binary -a and -o are inherently ambiguous. Use 'test EXPR1 && test EXPR2' or 'test EXPR1 || test EXPR2' instead.

Ou bien [[ EXPR1 && EXPR2 ]]/[[ EXPR1 || EXPR2 ]] (Attention c’est vrai en Bash, mais ça n’est pas forcément compatible avec tout les shells.).

P.S. Ma réponse doit être innexacte, parceque ${i} fonctionne aussi, mais là je ne suis as assez expert en bash pour pouvoir dire pourquoi…

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte