我正在创建一个分离的屏幕播放器,它运行脚本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[@]}"`
具有相同的不良结果。
答案 0 :(得分:2)
如果您不尝试通过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元字符,因此最好避免。