0
votes

Guillemets simples et doubles dans la même entrée bash

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 commentaires

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 utilisez read -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.)


3 Réponses :


0
votes

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.


0 commentaires

0
votes

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


0 commentaires

0
votes

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.


0 commentaires