2016-11-13 2 views
4

Я хочу сгенерировать команду SQOOP, которая добавляется некоторой переменной, например CUSTOM_PARAMS. Я определил переменную в файле: скажем hi.cfgКак избежать символов одиночной кавычки в подстановке команд bash

Переменная имеет некоторые одинарные кавычки, например, «orc».

cat hi.cfg 
CUSTOM_PARAMS="--query select * from blah..blah where \$CONDITIONS --split-by blah --create-hcatalog-table --hcatalog-external-table --hcatalog-storage-stanza stored as 'orc' --compress --compression-codec 'snappy' --fields-terminated-by '|' -m 5 --target-dir /any/dir" 

Когда я источник в файл на командной строке и не повторить это дает мне точно, Что написано там что выглядит правильно.

source hi.cfg 
echo "$CUSTOM_PARAMS" 
--query select * from blah..blah where $CONDITIONS --split-by blah --create-hcatalog-table --hcatalog-external-table --hcatalog-storage-stanza stored as 'orc' --compress --compression-codec 'snappy' --fields-terminated-by '|' -m 5 --target-dir /any/dir 

Но когда я называю это из сценария оболочки, как показано ниже:

cat hi.sh 

echo "Generating Sqoop Command" 
source $HOME/hi.cfg 
echo "${CUSTOM_PARAMS}" 
SQOOP_COMMAND="SQOOP statement : sqoop import blah blah "$CUSTOM_PARAMS"" 
echo $SQOOP_COMMAND 

Символ * в переменной была обработана как команда:

sh hi.sh 

Generating Sqoop Command 
--query select * from blah..blah where $CONDITIONS --split-by blah --create-hcatalog-table --hcatalog-external-table --hcatalog-storage-stanza stored as 'orc' --compress --compression-codec 'snappy' --fields-terminated-by '|' -m 5 --target-dir /any/dir 
SQOOP statement : sqoop import blah blah --query select 0 00 000000_0 000073_0 000103_0 02 09.txt 1 from blah..blah where $CONDITIONS --split-by blah --create-hcatalog-table --hcatalog-external-table --hcatalog-storage-stanza stored as 'orc' --compress --compression-codec 'snappy' --fields-terminated-by '|' -m 5 --target-dir /any/dir 

Мне нужно запустить инструкцию SQOOP позже в скрипте и попробовать несколько вариантов, но не помогло. Я также попытался \*, но не помогло, она выводит:

Generating Sqoop Command 
--query select \* from blah..blah where $CONDITIONS --split-by blah --create-hcatalog-table --hcatalog-external-table --hcatalog-storage-stanza stored as 'orc' --compress --compression-codec 'snappy' --fields-terminated-by '|' -m 5 --target-dir /any/dir 
SQOOP statement : sqoop import blah blah --query select \* from blah..blah where $CONDITIONS --split-by blah --create-hcatalog-table --hcatalog-external-table --hcatalog-storage-stanza stored as 'orc' --compress --compression-codec 'snappy' --fields-terminated-by '|' -m 5 --target-dir /any/dir` 

ответ

4

Изменить эту строку:

SQOOP_COMMAND="SQOOP statement : sqoop import blah blah "$CUSTOM_PARAMS"" 

Для этого:

SQOOP_COMMAND="SQOOP statement : sqoop import blah blah $CUSTOM_PARAMS" 

изменить также строку:

echo $SQOOP_COMMAND 

Для этого:

echo "$SQOOP_COMMAND" 

Или, если вы хотите, чтобы встроить дополнительные двойные кавычки, то это:

SQOOP_COMMAND="SQOOP statement : sqoop import blah blah \"$CUSTOM_PARAMS\"" 

Что происходит, так это то, как вы его написали, первая вложенная двойная кавычка закрывает цитируемый экспресс ион. Эффективно у вас есть SQOOP statement : sqoop import blah blah quoted, а затем $CUSTOM_PARAMS unquoted, , за которым следует пустая строка (""). Если вы хотите вставлять двойные кавычки в двойные кавычки, , тогда вам нужно сбежать от них с помощью \.

Но мне кажется, что вы не хотите вставлять двойные кавычки вообще.

+0

Спасибо, тонна Janos сейчас работает :) –

Смежные вопросы