Escapando; () em eco

0

como posso escapar de ; ou () ou "" no eco? Eu quero ecoar este comando

"LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');"

mas diz: syntax error near unexpected token } '' até eu mudei esse comando com uma citação simples como esta

'LOAD DATA INPATH '"'"$i"'"' INTO TABLE transient.url_log_201803 partition (ds='"'"$TGLS"'"', periode='"'"$WKTS"'"');'

Eu não sei como ecoar esse comando no terminal ou no arquivo. E também tentei usar \ para escapar e nada

    
por Nicky Puff 06.04.2018 / 20:42

3 respostas

2

Se você está tentando impedir que as variáveis se expandam, é necessário escapar do $ com \ . Pode parecer desnecessário devido às variáveis estarem entre aspas simples, no entanto, as aspas duplas em torno das aspas simples fazem com que as aspas simples sejam interpretadas literalmente:

$ echo "LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');"
LOAD DATA INPATH '' INTO TABLE transient.url_log_201803 partition (ds='', periode='');

Variáveis de escape:

$ echo "LOAD DATA INPATH '\$i' INTO TABLE transient.url_log_201803 partition (ds='\$TGLS', periode='\$WKTS');"
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');

Se sua intenção era manter as aspas duplas em torno da coisa toda:

$ echo "\"LOAD DATA INPATH '\$i' INTO TABLE transient.url_log_201803 partition (ds='\$TGLS', periode='\$WKTS');\""
"LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');"
    
por 06.04.2018 / 20:52
3

Não tente usar echo com dados complicados.

O seguinte usa um documento aqui:

cat <<END_SQL
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL

Se você precisar canalizar isso para um comando como mysql (este é um comando Hive SQL, mas eu não sei para que o cliente Hive normalmente é chamado, então eu uso mysql nos exemplos):

cat <<END_SQL | mysql
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL

Se você precisar passá-lo sem expandir as variáveis:

cat <<'END_SQL' | mysql
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL

Usar um documento aqui também permite escrever código mais legível (linhas mais curtas):

cat <<'END_SQL' | mysql
LOAD DATA INPATH '$i'
INTO TABLE transient.url_log_201803
     PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL

Observe que o conteúdo do documento e (mais importante) a tag final ( END_SQL acima) não devem ser recuados:

for ...some loop range...; do
    cat <<END_SQL | mysql
LOAD DATA INPATH '$i'
INTO TABLE transient.url_log_201803
     PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
done

Se a tag de fechamento for recuada, o shell não a encontrará e você receberá uma mensagem de erro sobre o documento here ser finalizado no final do arquivo.

    
por 06.04.2018 / 21:40
0

Você não precisa escapar de parênteses ou ponto e vírgula com echo :

$ echo "Semicolons look like ';'.  Parens look like '(' and ')'."
Semicolons look like ';'.  Parens look like '(' and ')'.
    
por 06.04.2018 / 20:44

Tags