sh -c命令中的引号-语法错误

时间:2018-08-15 16:01:07

标签: bash shell sh

我想通过使用sh -c执行以下命令(因为我想稍后再添加类似的命令):

impala-shell -q "CREATE TABLE test LIKE PARQUET 'hdfs://.../foo.parquet' STORED AS PARQUET"

此命令正常工作。但是,如果我尝试

sh -c 'impala-shell -q "CREATE TABLE test LIKE PARQUET 'hdfs://../foo.parquet' STORED AS PARQUET"'

我收到语法错误:

LIKE PARQUET hdfs://.../...
             ^

hdfs路径中的单引号一定存在问题,但我无法弄清楚。 hdfs路径必须用引号引起来。我还尝试用/'反斜杠,该斜杠实际上应该根据文档工作。我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:2)

您可以使用Python告诉您如何引用shell命令。对真的。 :)

python -c '
import sys
try:
    from pipes import quote
except ImportError:
    from shlex import quote
print(quote(sys.stdin.read().rstrip("\n")))
' <<'EOF'
impala-shell -q "CREATE TABLE test LIKE PARQUET 'hdfs://.../foo.parquet' STORED AS PARQUET"
EOF

...作为输出发出:

'impala-shell -q "CREATE TABLE test LIKE PARQUET '"'"'hdfs://.../foo.parquet'"'"' STORED AS PARQUET"'

...事实上,您可以成功运行:

sh -c 'impala-shell -q "CREATE TABLE test LIKE PARQUET '"'"'hdfs://.../foo.parquet'"'"' STORED AS PARQUET"'

由于单引号中的所有内容都是文字,包括反斜杠,因此您需要更改为其他引号上下文,以便在单引号字符串中包含单引号文字。

这就是'"'"'的作用:首先,它结束单引号上下文。然后进入双引号上下文;然后插入文字';然后结束双引号上下文;然后返回单引号上下文。