409 votes

Comment échapper à un guillemet double à l'intérieur de guillemets doubles ?

Comment échapper aux guillemets doubles à l'intérieur d'une chaîne double en Bash ?

Par exemple, dans mon shell script

#!/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 le ENCLOSED BY '\"' avec des guillemets doubles pour s'échapper correctement. Je ne peux pas utiliser de guillemets simples pour ma variable, car je veux utiliser la variable $dbtable .

1 votes

0 votes

5 votes

@kenorb Ça ne ressemble pas à une duplication de cette question...

20voto

Danny Hong Points 409

Vérifiez printf ...

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

Sans utiliser printf

echo -e $mystr

Sortie : dire "salut"

Utilisation de printf

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

Sortie : say \"hi\"

2 votes

Notez que printf permet également d'échapper à d'autres caractères, tels que ' , ( et )

0 votes

printf %q génère des chaînes de caractères prêtes pour eval qui n'est pas formaté pour echo -e .

3 votes

Il n'y a aucune raison d'envelopper le printf avec un utilisation inutile de echo . Dans vos deux exemples, les guillemets ne sont pas respectés. La bonne solution est de mettre la variable entre guillemets.

12voto

Trisha Chatterjee Points 533

Utilisez $"string".

Dans cet exemple, ce serait,

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

Note(de la page de manuel ) :

Une chaîne de caractères entre guillemets précédée d'un signe dollar ($"chaîne") entraîne la traduction de la chaîne en fonction de la locale courante. Si la locale courante est C ou POSIX, le signe dollar est ignoré. Si la chaîne est traduite et remplacée, le remplacement est entre guillemets.

-10voto

Shilv Points 13

Ajouter "\" avant le guillemet double pour l'é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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X