bash脚本传递数组参数时出现"("意外语法错误的问题求助
看起来你的问题核心是调用脚本的方式不对,导致用了不支持bash数组语法的POSIX shell(比如dash)来执行你的bash脚本,具体分析和解决办法如下:
错误原因
你的check_resolution_video.sh开头已经写了#!/bin/bash,但如果用sh命令去调用它(比如主脚本里的sh "$path"/check_resolution_video.sh "${arr[@]}"),或者用.(source)命令但当前shell不是bash的话,系统会用默认的sh来执行——而很多Linux发行版里/bin/sh其实是指向dash的,dash是POSIX标准的轻量shell,不支持bash特有的数组语法,所以遇到arr=("$@")这种写法就会报错Syntax error: "(" unexpected。
另外你主脚本里的source调用还有语法错误:.~/Script/check_resolution_video.sh里的.和~/之间没有空格,正确写法是. ~/Script/check_resolution_video.sh,但即使修正了空格,source的方式还是依赖当前shell是bash才能支持数组。
解决步骤
修正脚本调用方式
- 把主脚本里所有调用
check_resolution_video.sh和bitrate.sh的地方,从sh xxx.sh或者. xxx.sh改成用bash直接调用:- 比如把
sh "$path"/check_resolution_video.sh "${arr[@]}"改成bash "$path"/check_resolution_video.sh "${arr[@]}" - 把
.~/Script/check_resolution_video.sh "${arr[@]}"改成bash ~/Script/check_resolution_video.sh "${arr[@]}" - 把
.~/Script/bitrate.sh "${arr[1]}_1080_directory" "output.mp4"改成bash ~/Script/bitrate.sh "${arr[1]}_1080_directory" "output.mp4"
这样能确保脚本用bash来执行,完美支持数组语法。
- 比如把
- 把主脚本里所有调用
验证系统默认shell
可以运行ls -l /bin/sh看看你的默认sh指向什么,如果是dash,那以后尽量不要用sh来执行bash脚本,避免再踩类似的兼容坑。确保主脚本的执行环境
你的主脚本开头已经有#!/bin/bash,所以运行主脚本的时候最好用bash main_script.sh,或者先给主脚本加可执行权限(chmod +x main_script.sh)然后直接./main_script.sh,这样能保证主脚本本身也是在bash环境下运行,避免后续调用出现连锁的兼容问题。
额外小提示
你主脚本里的path=pwd``可以改成更安全的path=$(pwd),这是bash里推荐的命令替换写法;另外read -p的交互方式如果是批量处理的话可能不太方便,不过这个属于额外优化选项了。
备注:内容来源于stack exchange,提问作者ilie alexandru

