如何将多个参数传递给屏幕命令中调用的脚本?

How can I pass multiple arguments to script invoked within screen command?

我正在创建一个独立的屏幕播放器,它运行脚本 player.sh,它有多个来自 AR 数组的参数。

AR=('foo' 'bar' 'space' 'bat')
screen -S player -dm bash -c "/home/deanresin/scripts/player.sh ${AR[@]}"

但它被解析为...

+ screen -S player -dm bash -c '/home/deanresin/scripts/player.sh foo' bar space bat

并且只有第一个参数 foo 被传递给 player.sh。

如果我手动输入数组就可以了..

screen -S player -dm bash -c "/home/deanresin/scripts/player.sh foo bar space bat"

+ screen -S player -dm bash -c '/home/deanresin/scripts/player.sh foo bar space bat'

它们都传递给 player.sh。

请帮忙,我一直在拔头发。

编辑:

我也试过了..

screen -S player -dm bash -c "/home/deanresin/scripts/player.sh "`echo "${AR[@]}"`

同样不想要的结果。

如果您不尝试通过 bash -c 添加间接寻址会更容易:

screen -S player -dm /home/deanresin/scripts/player.sh "${AR[@]}"

如果确实需要将其嵌套在 bash -c 中,则应正确转义参数并将它们连接成单个参数:

screen -S player -dm bash -c "/home/deanresin/scripts/player.sh $(printf "%q " "${AR[@]}")"

或者将它们作为单独的参数传递,这些参数在脚本字符串本身中作为 $@ 可用,需要仔细引用以确保它是文字:

screen -S player -dm bash -c '/home/deanresin/scripts/player.sh "$@"' _ "${AR[@]}"

错误的解决方案是使用 bash -c "/home/deanresin/scripts/player.sh ${AR[*]}" 而不是连接所有元素而不转义,但这不考虑 shell 个元字符,因此最好避免。