Como escapar aspas duplas dentro de uma sequência dupla no Bash?
Por exemplo, no meu script de 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"
Não consigo fazer ENCLOSED BY '\"'
com que as aspas duplas escapem corretamente. Não posso usar aspas simples para minha variável, porque quero usar a variável $dbtable
.
$dbtable
, há um risco. Isso seria muito incomum, no entanto, como os usuários finais normalmente não fazem SSH em uma máquina para carregar seus dados.Respostas:
Use uma barra invertida:
fonte
x=ls; if [ -f "$(which "\""$x"\"")" ]; then echo exists; else echo broken; fi;
dá quebrado enquanto... [ -f "$(which $x)" ]; ...
ou... [ -f $(which "$x") ]; ...
funciona muito bem. Surgiriam problemas quando um$x
ou o resultado de desse$(which "$x")
algo com um espaço ou outro caractere especial. Uma solução alternativa está usando uma variável para conter o resultadowhich
, mas o bash é realmente incapaz de escapar de uma cotação ou estou fazendo algo errado?grep -oh "\"\""$counter"\""\w*"
como parte de uma sintaxe bash em que in$counter
é uma variável. ele não gosta de nenhum pensamentoUm exemplo simples de escape de aspas no shell:
Isso é feito finalizando um já aberto (
'
), colocando o escapado (\'
) e abrindo outro ('
).Alternativamente:
Isso é feito terminando já aberto um (
'
), colocando uma cotação em outra cotação ("'"
) e depois abrindo outra ('
).Mais exemplos: Escapando aspas simples em strings entre aspas simples
fonte
echo "abc\"abc"
é suficiente para produzirabc"abc
como na resposta de Peter.Não sei por que esse problema antigo apareceu hoje nas listagens marcadas com Bash, mas, no caso de futuros pesquisadores, lembre-se de que você pode evitar escapar usando códigos ASCII dos caracteres que você precisa ecoar.
Exemplo:
\x22
é o código ASCII (em hex) para aspas duplas e\x27
aspas simples. Da mesma forma, você pode repetir qualquer personagem.Suponho que, se tentarmos fazer eco da string acima com barras invertidas, precisaremos de um eco bagunçado de duas linhas com barra invertida ... :)
Para atribuição de variável, isso é equivalente:
Se a variável já estiver definida por outro programa, você ainda poderá aplicar aspas duplas / simples com ferramentas sed ou similares.
Exemplo:
fonte
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
O Bash permite que você coloque seqüências de caracteres adjacentes, e elas acabam sendo coladas.
Então, é isso:
produz
O truque é alternar entre cadeias simples e duplas, conforme necessário. Infelizmente, rapidamente fica muito confuso. Por exemplo:
produz
No seu exemplo, eu faria algo assim:
que produz a seguinte saída:
É difícil ver o que está acontecendo aqui, mas posso anotá-lo usando aspas Unicode. O seguinte não funciona no bash - é apenas para ilustração:
dbload=
'load data local infile "
''gfpoint.csv'
'" into
'table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '
'"
' “' LINES
” 'TERMINATED BY "
''\n'
'" IGNORE 1 LINES
' ' ' ' ' ' 'As aspas como "''" acima serão interpretadas por bash. As aspas como
" '
vão acabar na variável resultante.Se eu der o mesmo tratamento ao exemplo anterior, ele ficará assim:
$ echo
“I like to use
”'
"double quotes"
'“
sometimes
”fonte
Confira printf ...
Sem usar printf
Saída: diga "oi"
Usando printf
Saída: diga \ "oi \"
fonte
printf
escapa mais caracteres, bem como, tais como'
,(
e)
printf %q
gera seqüências de caracteres prontas paraeval
, não formatadas paraecho -e
.printf
com um uso inútil deecho
. Ambos os seus exemplos estão com citações quebradas. A correção adequada é colocar aspas duplas na variável.Armazene o caractere de aspas duplas como variável:
Resultado:
fonte
Faça uso de $ "string".
Neste exemplo, seria,
Nota (na página de manual ):
fonte
Adicione
"\"
antes de aspas duplas para escapar, em vez de\
fonte
csh
resposta para umabash
pergunta? Os dois são completamente distintos e incompatíveis.