bash si logique booléenne chaîne
Je suis pas la recherche d'une façon différente de faire l'intention apparente. Je suis à la recherche de comprendre pourquoi cette exacte syntaxe ne fonctionne pas.
[root@lvs ~]# while true;do
> echo "Would you like the script to check the second box ([y]n)?"
> read ans
> if [ "$ans" == "n" ];then
> echo
> echo "bye"
> exit
> elif [ "$ans" != "" -o "$ans" != "y" ];then
> echo "Invalid entry..."
> else
> break
> fi
> done
Would you like the script to check the second box ([y]n)? **"Should have continued"**
Invalid entry...
Would you like the script to check the second box ([y]n)? **"Should have continued"**
y
Invalid entry...
Would you like the script to check the second box ([y]n)? **"Correct behavior"**
alskjfasldasdjf
Invalid entry...
Would you like the script to check the second box ([y]n)? **"Correct behavior"**
n
bye
Voici une référence identique à tant d'autres que j'ai trouvé. Je comprendre ce qu'il fait, c'est à l'aide de la non logique du pour et ET OU quand tout ce que j'ai lu a dit qu'il devrait être à l'aide de logiques booléens.
http://www.groupsrv.com/linux/about140851.html
Ok donc, ici, il est, avec Nahuel la suggestion de se comporter de la façon dont j'avais prévu à l'origine pour:
[root@lvs ~]# while true;do
> echo "Would you like the script to check the second box ([y]n)?"
> read ans
> if [ "$ans" = "n" ];then
> echo
> echo "bye!"
> exit
> elif [ "$ans" != "" -a "$ans" != "y" ];then
> echo "Invalid entry..."
> else
> break
> fi
> done
Would you like the script to check the second box ([y]n)?
asdfad
Invalid entry...
Would you like the script to check the second box ([y]n)?
[root@lvs ~]# while true;do
> echo "Would you like the script to check the second box ([y]n)?"
> read ans
> if [ "$ans" = "n" ];then
> echo
> echo "bye!"
> exit
> elif [ "$ans" != "" -a "$ans" != "y" ];then
> echo "Invalid entry..."
> else
> break
> fi
> done
Would you like the script to check the second box ([y]n)?
y
[root@lvs ~]# while true;do
> echo "Would you like the script to check the second box ([y]n)?"
> read ans
> if [ "$ans" = "n" ];then
> echo
> echo "bye!"
> exit
> elif [ "$ans" != "" -a "$ans" != "y" ];then
> echo "Invalid entry..."
> else
> break
> fi
> done
Would you like the script to check the second box ([y]n)?
n
logout
- BTW,
==
est un bug qui est malheureusement accepté par bash. Seulement=
est la POSIX façon de tester l'égalité.
Vous devez vous connecter pour publier un commentaire.
Le problème est que : [ "$ans" != "" -o "$ans" != "y" ] est toujours vrai, car de la ou et la négation. $sna ne peut pas être égal à "" et "y".
Essayer de remplacer ces lignes
par ces
ou ces
Le plus facile est de le faire est un cas:
aussi
break
doit être utilisé uniquement dans unfor
ouwhile
boucle, ou dans unselect
mais il est manquant dans votre post .[ "$ans" != "" -a "$ans" != "y" ]
est équivalent à[ \! \( "$ans" = "" -o "$ans" = "y" \) ]
le problème est le-o
avec!=
Je ne comprends vraiment pas, pourquoi utilisez-vous -o dans la elif. Je voudrais utiliser "||" ou "OU" de l'opérateur. Lorsque vous utilisez deux conditions si, vous devriez utiliser des doubles [[ et ]].
Donc, si vous utilisez:
il fonctionne très bien.
aussi logiquement sa une mauvaise façon de faire les choses.
tout d'abord à l'aide de cas serait mieux dans ce scénario, d'autre part, vous êtes à la recherche pour == n, puis en indiquant si elle est vide ou n'est pas égale à oui - si bien qu'aucun n'est pris à la première instruction si, en théorie, il serait toujours à même de répondre second critère
sûrement la façon la plus logique de s'assurer de la contribution est de 100% serait
==
bug. La seule façon de bientest
pour l'égalité est=
.