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

4
我希望生成一个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"
当我在命令提示符中查找文件并执行echo命令时,输出的内容与文件中写的完全相同,看起来是正确的。
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个回答

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语句:sqoop import blah blah,接着是未被引用的$CUSTOM_PARAMS,最后是空字符串("")。 如果你想在双引号内嵌入双引号,那么你需要用\进行转义。 但我认为你根本不想嵌入双引号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接