如何在bash命令替换

时间:2016-11-13 11:55:29

标签: bash unix sqoop

我想生成一个SQOOP命令,该命令附加了一些变量,如CUSTOM_PARAMS。 我在文件中定义了变量:说hi.cfg

变量有一些单引号,就像'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

但是当我从shell脚本中调用它时如下:

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`

1 个答案:

答案 0 :(得分:4)

更改此行:

res = res.DistinctBy(x => x.Id);

对此:

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未加引号, 后跟一个空字符串($CUSTOM_PARAMS)。 如果你想在双引号中嵌入双引号, 那么你需要用""来逃避它们。

但在我看来,你根本不想嵌入双引号。