如何在bash命令替换中转义单引号字符

如何在bash命令替换中转义单引号字符

问题描述:

我想生成一个由CUSTOM_PARAMS等变量附加的SQOOP命令。 我已经在一个文件中定义了变量:说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 

但是,当我把这种从下面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` 

改变这一行:

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

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

+0

非常感谢Janos现在可以运作:) –