如何在 bash 命令替换中转义单引号字符
How to escape single quote characters in bash command substitution
我想生成一个 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`
更改此行:
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
未引用,
后跟一个空字符串 (""
)。
如果你想在双引号内嵌入双引号,
那么你需要用 \
.
来逃避它们
但在我看来你根本不想嵌入双引号。
我想生成一个 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`
更改此行:
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
未引用,
后跟一个空字符串 (""
)。
如果你想在双引号内嵌入双引号,
那么你需要用 \
.
但在我看来你根本不想嵌入双引号。