如何将数组放入命令字符串中通过eval命令正确执行
问题原因
你遇到的确实是引号嵌套解析的问题:
shell解析com="./test2.sh "$array1" "$array2" "时,相邻的双引号会直接闭合,你写的外层双引号和包裹array1、array2的双引号没有转义,最终com变量展开后的内容是:./test2.sh /dir/file1.txt /dir/file2.txt /dir/file3.txt /dir/file4.txt /dir/file5.txt /dir/file6.txt
相当于把两个路径字符串拆成了6个独立参数传给test2.sh,test2.sh只能拿到前两个参数,自然只输出array1的前两个路径。
解决方法
方法1:转义内层双引号(最贴合现有写法的方案)
给com变量里包裹array1、array2的双引号加反斜杠转义,让eval执行时能识别到这两个是带引号的完整参数,同时eval后的变量也要用双引号包裹避免二次拆分:
array1="/dir/file1.txt /dir/file2.txt /dir/file3.txt" array2="/dir/file4.txt /dir/file5.txt /dir/file6.txt" com="./test2.sh \"$array1\" \"$array2\"" eval "$com"
方法2:用数组存储命令(更安全的替代方案)
如果使用bash、zsh等支持数组的shell,用数组存储命令参数可以避免大量转义逻辑,扩展性更强,后续新增参数直接往数组追加即可:
array1="/dir/file1.txt /dir/file2.txt /dir/file3.txt" array2="/dir/file4.txt /dir/file5.txt /dir/file6.txt" com=(./test2.sh "$array1" "$array2") eval "${com[@]}"
内容的提问来源于stack exchange,提问作者PWvanZalm
相关产品推荐
相关产品推荐

