Comment puis-je échapper les guillemets doubles à l'intérieur d'une chaîne double dans Bash?
Par exemple, dans mon script shell
#!/bin/bash
dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"
Je ne peux pas obtenir la ENCLOSED BY '\"'
double citation pour m'échapper correctement. Je ne peux pas utiliser de guillemets simples pour ma variable, car je veux utiliser une variable $dbtable
.
$dbtable
, il y a un risque. Ce serait très rare, cependant, car les utilisateurs finaux ne font généralement pas de SSH sur une machine pour charger leurs données.Réponses:
Utilisez une barre oblique inverse:
la source
x=ls; if [ -f "$(which "\""$x"\"")" ]; then echo exists; else echo broken; fi;
donne cassé tandis que... [ -f "$(which $x)" ]; ...
ou... [ -f $(which "$x") ]; ...
fonctionne très bien. Des problèmes surgiraient lorsque l'un$x
ou le résultat de$(which "$x")
donnerait quelque chose avec un espace ou un autre caractère spécial. Une solution de contournement utilise une variable pour contenir le résultatwhich
, mais bash est-il vraiment incapable d'échapper à un devis ou est-ce que je fais quelque chose de mal?grep -oh "\"\""$counter"\""\w*"
dans le cadre d'une syntaxe bash où in$counter
est une variable. il n'aime pas les penséesUn exemple simple d'échapper des guillemets dans le shell:
Pour ce faire, vous devez terminer celui déjà ouvert (
'
), placer celui échappé (\'
), puis en ouvrir un autre ('
).Alternativement:
Pour ce faire, vous devez terminer un (
'
) déjà ouvert , placer un devis dans un autre quote ("'"
), puis en ouvrir un autre ('
).Plus d'exemples: échappement de guillemets simples dans des chaînes entre guillemets simples
la source
echo "abc\"abc"
suffit de produireabc"abc
comme dans la réponse de Peter.Je ne sais pas pourquoi cet ancien problème est apparu aujourd'hui dans les listes marquées Bash, mais juste au cas où de futurs chercheurs, gardez à l'esprit que vous pouvez éviter de vous échapper en utilisant les codes ASCII des caractères que vous devez faire écho.
Exemple:
\x22
est le code ASCII (en hexadécimal) pour les guillemets doubles et\x27
pour les guillemets simples. De même, vous pouvez faire écho à n'importe quel caractère.Je suppose que si nous essayons de faire écho à la chaîne ci-dessus avec des barres obliques inverses, nous aurons besoin d'un écho désordonné à deux lignes ... :)
Pour l'affectation des variables, c'est l'équivalent:
Si la variable est déjà définie par un autre programme, vous pouvez toujours appliquer des guillemets doubles / simples avec sed ou des outils similaires.
Exemple:
la source
echo 'export PS1='\[\033[00;31m\]${?##0}$([ $? -ne 0 ] && echo \x22 \x22)\[\033[00;32m\]\u\[\033[00m\]@\[\033[00;36m\]\h\[\033[00m\][\[\033[01;33m\]\d \t\[\033[00m\]] \[\033[01;34m\]\w\n\[\033[00m\]$( [ ${EUID} -ne 0 ] && echo \x22$\x22 || echo \x22#\x22 ) '' >> ~/.profile
Bash vous permet de placer des chaînes de façon adjacente, et elles finiront par être collées ensemble.
Donc ça:
produit
L'astuce consiste à alterner entre les chaînes simples et doubles entre guillemets selon les besoins. Malheureusement, cela devient rapidement très compliqué. Par exemple:
produit
Dans votre exemple, je le ferais quelque chose comme ceci:
qui produit la sortie suivante:
Il est difficile de voir ce qui se passe ici, mais je peux l'annoter en utilisant des guillemets Unicode. Ce qui suit ne fonctionnera pas dans bash - c'est juste pour l'illustration:
dbload=
'load data local infile "
' "'gfpoint.csv'
" '" into
' "table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '
" '"
' "' LINES
" 'TERMINATED BY "
' "'\n'
" '" IGNORE 1 LINES
'Les guillemets comme «'» »ci-dessus seront interprétés par bash. Les guillemets comme
" '
se retrouveront dans la variable résultante.Si je donne le même traitement à l'exemple précédent, cela ressemble à ceci:
$ echo
"I like to use
"'
"double quotes"
'"
sometimes
"la source
Découvrez printf ...
Sans utiliser printf
Sortie: dites "salut"
Utilisation de printf
Sortie: dites \ "salut \"
la source
printf
échappe également à d'autres personnages, tels que'
,(
et)
printf %q
génère des chaînes prêtes poureval
, non formatées pourecho -e
.printf
avec une utilisation inutile deecho
. Vos deux exemples ont rompu les citations. Le correctif correct consiste à mettre entre guillemets la variable.Stockez le caractère guillemet double comme variable:
Production:
la source
Utilisez $ "string".
Dans cet exemple, ce serait,
Remarque (à partir de la page de manuel ):
la source
Ajouter
"\"
avant les guillemets doubles pour l'échapper, au lieu de\
la source
csh
réponse à unebash
question? Les deux sont complètement distincts et incompatibles.