2017-07-27 1 views
2

J'étudie actuellement le script shell et j'ai un problème de syntaxe.Bash: script shell if instruction utilisant plusieurs conditions incluant regex

ce que je suis Tyring est de faire le « si » la déclaration pour prendre toute entrée par l'utilisateur avec l'alphabet, à l'exception de la ligne

est le code ici « giveup » que je CONSTRUIT:

if [ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ] 

une fois que je lance le code, il donne le message d'erreur indiquant que:

[: missing `]' 

Si vous les gars avez une solution à cela, je serai heureux d'entendre vos conseils :)

Merci!

Répondre

2

test ([) intégré selon l'une quelconque coque (ou l'une externe) ne supporte pas le mettre par exemple d'assemblage conditionnel &&, || ou un séparateur de commandes multiples, par ex. ; à l'intérieur.

En outre, [ ne prend pas en charge Regex correspondant à =~. BTW votre motif Regex n'est pas correct, il ressemble plus à un motif de glob (et cela devrait suffire dans ce cas).

Les deux éléments ci-dessus sont pris en charge par le mot clé [[ de bash et tous les conteneurs ne les prennent pas en charge.

Ainsi, vous pouvez faire:

if [[ $usrGuess = *[[:alpha:]]* && $usrGuess != "giveup" ]] 

Ici, je suis déplacé pour [[ et utilisé le match Glob $usrGuess = *[:alpha:]* (dropped correspondant Regex).

+0

Merci pour votre précieuse réponse. Je suis totalement nouveau dans ce domaine et vous avez fourni une excellente explication de ce que je me demandais. Encore une fois, merci beaucoup! –

+0

@HojinLee Glad je pourrais aider :) – heemayl

0

Utilisation doubles crochets, comme condition est composite:

if [[ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ]] 
+0

wow, merci pour votre réponse rapide! C'est assez embarrassant, mais je ne comprends toujours pas comment cela fonctionne. Ce que j'ai trouvé, c'est que la double parenthèse rend le processus plus rapide, mais je ne comprends pas quelle est la différence entre les deux en termes de syntaxe.Ça vous dérange de m'expliquer cela pour moi? –

+0

'* [: alpha:] *' n'est pas une expression régulière valide. – chepner

0

Une approche légèrement différente utilisant la commande grep fonctionnerait également.

if grep -v '^giveup$' <<<$userGuess | grep -iq '^[a-z]*$' 

Dans cet exemple, nous utilisons le code de sortie de la commande grep pour prendre une décision if-else. Notez également l'option '-q' pour la seconde commande grep. Cela garantit que la commande grep correspond au modèle en mode silencieux.

Pour: Clause if() moins compliquée. Con: Il existe deux processus grep exécutés.

+0

Merci, je n'ai jamais pensé à cette approche. Littéralement, j'ai commencé à regarder ce script shell hier et il ne se sent pas près du Java. : P –

0

Si vous souhaitiez conserver la compatibilité POSIX, utilisez la commande expr pour effectuer la correspondance d'expression régulière.

if expr "$usrGuess" : '[[:alpha:]]*' > /dev/null && [ "$usrGuess" != "giveup" ] 

De toute façon, je choisirais de vérifier par rapport à "donner" d'abord; Si cette vérification échoue, vous évitez complètement la vérification d'expression régulière plus coûteuse.