命令参数的 shell 字符串转义

命令参数的 shell 字符串转义

我正在尝试用以下命令创建“/tmp/pwet/foo bar”:

DIR="/tmp/pwet/foo bar"
ARGS="-p ${DIR}"
mkdir $ARGS

出于集成原因,我必须将 ARGS 构建分两步进行: ARG = some_options + $DIR 此代码创建 2 个目录:/tmp/pwet/foo./bar。这不是我想要的。

我尝试过很多逃避的事情,但没有结果。我用 bash 运行脚本。有什么好的解决办法呢?

答案1

问题不在于变量的内容(这就是为什么你可以尝试使用尽可能多的转义字符),而在于 bash 按$ARGS字面意思替换变量内容,因此其中的空格将是实际的命令中的空格。

只需使用mkdir "$ARGS"(即,将变量引用括在"s 中)

更新:正如评论中所讨论的,为了使-p和其他选项不成为目录名称的一部分,请定义 2 个变量:

OPTS="-p -whatever"ARGS="/tmp/pwet/foo bar"

然后稍后像这样发出 mkdir :

mkdir $OPTS "$ARGS"

或者,如果您想使用转义字符完全控制它,并且可以拥有多个目录,有些带有空格,有些没有选项,全部混合在一起,您可以将整个命令放在一个变量中并使用 bash -c 执行它。

检查下面的示例作为您可以尝试的起点:

MKDIRCMD="mkdir -p \"A B\" \"C D\""
echo $MKDIRCMD # Notice the \ characters are NOT part of the string
bash -c "$MKDIRCMD"

相关内容