Je veux donner une entrée à une fonction de lecture bash qui contient à la fois des guillemets simples et doubles en même temps, puis la comparer avec une valeur stockée.
Ce script pose une question aléatoire au démarrage, à la recherche d'une syntaxe correcte de certaines commandes que je veux mémoriser. Cependant, certaines de ces commandes contiennent à la fois des guillemets simples et doubles, alors comment gérer cela avec bash?
#!/bin/bash echo "What is the secret string?" read secret if [ "$secret" = "123" ] then echo "You're Awesome!!!" else echo "You're memory sucks!!" fi
Donc, si $ question est "Salut mon nom est 'Ed'", y compris les guillemets simples ET doubles dans la même entrée, comment puis-je travailler cette magie?
3 Réponses :
Il n'y a pas de magie à travailler. L'entrée de l'utilisateur ne devient jamais syntaxe dans votre script - elle n'est jamais évaluée en tant que code - donc elle peut contenir quoi que ce soit. *
* Sauf pour le caractère NUL (\ 0) lui-même, puisqu'il s'agit du caractère de fin de chaîne.
lire
les chaînes qui contiennent des guillemets ne nécessite rien de spécial, mais j'utiliserais read -r
pour éviter que cela ne gêne les barres obliques inverses. Vous pouvez également utiliser l'option -p
pour fournir une invite (au lieu de echo
en la remplaçant séparément):
$ ./secrettest.sh What is the secret string? dq: ", sq: ', dollar: $ You're Awesome!!!
La seule chose délicate ici spécifie la chaîne à comparer. Une option consiste à l'exprimer sous la forme d'une chaîne entre guillemets et à échapper les guillemets doubles à l'intérieur avec des barres obliques inverses. Vous devrez également échapper tout signe dollar, contre-oblique ou contre-oblique de la même manière:
if [ "$secret" = "dq: \", sq: ', dollar: \$" ] then echo "You're Awesome!!!" else echo "Your memory sucks!!" fi
Voici un exemple d'exécution du code ci-dessus:
read -r -p "What is the secret string? " secret
Ma question portait sur la spécification de la chaîne dans le code comme l'a mentionné Gordon, et non sur la lecture à partir de l'entrée. J'avais échappé aux guillemets doubles et simples dans mon original, c'est pourquoi cela n'a pas fonctionné. Donc, ceci
if [ "$secret" = "command 'with \"options\"'" ]
aurait dû être ceci
if [ "$secret" = "command \'with \"options\"\'" ]
Merci les gars.
Je ne suis pas sûr de comprendre.
read
lirait les caractères que vous avez tapés, comme vous les avez tapés (à l'exception de certains caractères précédés d'une barre oblique inverse, sauf si vous utilisezread -r
).Je ne comprends pas très bien ce que vous essayez de faire / quel problème vous rencontrez. Votre dernière phrase - la partie question réelle - mentionne la variable
$ question
, mais cette variable n'apparaît pas dans le code que vous avez publié. Pouvez-vous mettre à jour votre code pour qu'il corresponde à votre cas d'utilisation réel?(Pour ajouter à mon commentaire précédent: essayez de publier du code qui ne fonctionne pas , avec une explication de ce qu'il essaie de faire. Nous pouvons alors vous aider à corriger ce code.)