Comment échapper à une double citation entre guillemets?

Quelqu’un peut-il me montrer comment échapper à la double citation dans une chaîne double en 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 parviens pas à obtenir le code ENCLOSED BY \" avec une double citation échappée correctement. Je ne peux pas utiliser le guillemet simple pour ma variable car je veux utiliser la variable $dbtable .

Utilisez une barre oblique inverse:

 echo "\"" # Prints one " character. 

Exemple simple d’évitement des guillemets dans le shell:

 $ echo 'abc'\''abc' abc'abc $ echo "abc"\""abc" abc"abc 

Cela se fait en finissant un déjà ouvert ( ' ), en plaçant un échappé un ( \' ), puis en en ouvrant un autre ( ' ).

Alternativement:

 $ echo 'abc'"'"'abc' abc'abc $ echo "abc"'"'"abc" abc"abc 

Cela se fait en terminant un déjà ouvert ( ' ), en plaçant une citation dans une autre citation ( "'" ), puis en en ouvrant une autre ( ' ).

Autres exemples: Échappement de guillemets simples dans des chaînes entre guillemets simples

Je ne sais pas pourquoi cet ancien problème a surgi aujourd’hui dans les listes balisées, mais pour les futurs chercheurs, gardez à l’esprit que vous pouvez éviter de vous échapper en utilisant les codes ascii des caractères à utiliser. Exemple:

 echo -e "this is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22" this is "'"'"text"'"'" 

\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 en arrière … 🙂

Pour l’affectation de variables, c’est l’équivalent:

 $ a=$'this is \x22text\x22' $ echo "$a" this is "text" 

Si la variable est déjà définie par un autre programme, vous pouvez toujours appliquer des guillemets simples / doubles avec des outils sed ou similaires. Exemple:

 $ b="just another text here" $ echo "$b" just another text here $ sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator just another "0" here #this is not what i wanted to be $ sed 's/text/\x22\x27\0\x27\x22/' <<<"$b" just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way. 

Bash vous permet de placer des chaînes de façon adjacente, et elles finiront par être collées ensemble.

Donc ça:

 $ echo "Hello"', world!' 

produit

 Hello, world! 

L’astuce consiste à alterner des chaînes simples et des chaînes entre guillemets, si nécessaire. Malheureusement, cela devient rapidement très compliqué. Par exemple:

 $ echo "I like to use" '"double quotes"' "sometimes" 

produit

 I like to use "double quotes" sometimes 

Dans votre exemple, je le ferais comme ceci:

 $ dbtable=example $ dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES' $ echo $dbload 

qui produit la sortie suivante:

 load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES 

Il est difficile de voir ce qui se passe ici, mais je peux l’annoter en utilisant les guillemets Unicode. Ce qui suit ne fonctionnera pas dans bash – c’est juste pour l’illustrer:

dbload=load data local infile "'gfpoint.csv' »’ " into ‘ ” table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY ' »’ " ‘” ' LINESTERMINATED BY " ‘” '\n' ‘ ‘ " IGNORE 1 LINES

Les guillemets comme “”” dans ce qui précède 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:

$ echoI like to use"double quotes"sometimes

Découvrez printf

 #!/bin/bash mystr="say \"hi\"" 

Sans utiliser printf

 echo -e $mystr 

sortie: dites “salut”

Utiliser printf

 echo -e $(printf '%q' $mystr) 

sortie: dis \ “salut \”

Utilisez $ “ssortingng”.

Dans cet exemple, ce serait,

dbload = $ “charger l’infile local de données \” ‘gfpoint.csv’ \ “dans la table $ dbtable FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘\”‘ LIGNES TERMINÉES PAR \ “‘\ n’ \” IGNORE 1 LINES ”

Note (de la page de manuel ):

Une chaîne entre guillemets précédée d’un signe dollar ($ “ssortingng”) entraînera la traduction de la chaîne en fonction de la localisation courante. Si les parameters régionaux actuels sont C ou POSIX, le signe dollar est ignoré. Si la chaîne est traduite et remplacée, le remplacement est entre guillemets.

Stockez le caractère guillemet double comme variable:

 dqt = '"'
 echo "Double guillemets $ {dqt} X $ {dqt} dans une chaîne entre guillemets"

Sortie:

 Double guillemets "X" dans une chaîne entre guillemets

Ajouter "\" avant le double guillemet pour y échapper, au lieu de \

 #! /bin/csh -f set dbtable = balabala set dbload = "load data local infile "\""'gfpoint.csv'"\"" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"\""' LINES TERMINATED BY "\""'\n'"\"" IGNORE 1 LINES" echo $dbload # load data local infile "'gfpoint.csv'" into table balabala FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "''" IGNORE 1 LINES