如何在命令替换中将所有 bash 参数传递给 bash -c?



我正在尝试有条件地将脚本参数传递给bash -c,而脚本参数本身被传递给docker run命令。下面的示例说明了我正在尝试执行的操作。

#!/bin/bash
echo "Args: ${@}"
docker run ubuntu 
$( if [[ ! -z ${@} ]]; then echo "bash -c ${@}"; fi )
docker run ubuntu 
$( if [[ ! -z ${@} ]]; then echo "bash -c "${@}""; fi )

对于呼叫./myscript.sh ls -la,这给了我以下输出。

Args: ls -la
bin
boot
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
-la": -c: line 0: unexpected EOF while looking for matching `"'
-la": -c: line 1: syntax error: unexpected end of file

如您所见,第一个docker run调用有效,但忽略了也已传递的-la标志。我想过尝试将传递给bash -c的命令(即ls -la)括在转义引号中,但这根本不起作用。

如何实现所需的行为?提前感谢!

你基本上是在做一个

bash -c ls -la

如果您在命令行上执行相同的命令,则可以重现此命令:它将给出相同的结果。

从 bash 手册页中关于-c选项:

。命令是从第一个非选项参数command_string读取的。 如果command_string后有参数,则第一个参数分配给 $0,并将任何剩余参数分配给位置参数。 赋值为 $0 将设置在警告和错误消息中使用的 shell 的名称。

因此,-la不会作为参数传递给ls。你必须做一个

bash -c "ls -la"

如果我正确理解您的代码,如果参数列表为空,您不希望在 docker 上运行参数。然后我会尝试一个

(( $# > 0 )) && docker run ubuntu bash -c "$*"

最新更新