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

8yparm6h  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(470)

我想生成一个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`
9q78igpj

9q78igpj1#

更改此行:

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 不带引号,后跟空字符串( "" ). 如果要在双引号中嵌入双引号,则需要使用 \ .
但在我看来你根本不想把双引号加进去。

相关问题