我从脚本运行FFmpeg命令,该脚本接受多个参数并将它们传递给命令。
#!/bin/bash
while getopts "i:b:" flag
do
case "$flag" in
i) input="$OPTARG";;
b) IFS=, read -a bitrate <<< "$OPTARG";;
esac
done
for rate in "${bitrate[@]}";
do
ffmpeg -i $input -video_size 100x100 -b:v $bitrate -y output.mp4
done
exit
我使用getopts
获取变量,使用for
循环来运行命令
要运行脚本,我使用script.sh -i input.mov -b 1000,2000,3000
,FFmpeg运行3次,每次都有不同的$bitrate
值。
如果我想将另一个var - scale传递给命令并运行它,那会怎么样:
script.sh -b 1000,2000,3000 -s 100x100,200x200,300x300
所以第一次运行将使用-b 1000和-s 100x100,第二次运行使用-b 2000和-s 200x200,依此类推。
这是不可原谅的?如果可能的话,我想继续使用getopts。
答案 0 :(得分:0)
假设两个数组具有相同的索引:
for i in "${!bitrate[@]}"; do # i iterates over the indices of bitrate
ffmpeg -i "$input" -video_size "${scale[i]}" -b:v "${bitrate[i]}" -y output.mp4
done
答案 1 :(得分:0)
您可以找到有关getopts
here的更多信息。简而言之,您只需添加s:
即可接受参数-s
的值,并以与参数-b
相同的方式阅读它们。
添加嵌套的for循环以遍历指定的大小值:
for rate in "${bitrate[@]}"; do
for size in "${sizes[@]}"; do
...
done
done
为了它,在下面的完整脚本实现中,我还添加了参数检查,如果没有指定-s
和-b
,它们将导致#!/bin/bash
while getopts "i:b:s:" flag
do
case "$flag" in
i) input="$OPTARG" ;;
b) IFS=, read -a bitrate <<< "$OPTARG" ;;
s) IFS=, read -a sizes <<< "$OPTARG" ;;
esac
done
(( ${#bitrate[@]} == 0 )) && bitrate=("1000")
(( ${#sizes[@]} == 0 )) && sizes=("100x100")
for rate in "${bitrate[@]}"; do
for size in "${sizes[@]}"; do
ffmpeg -i ${input} -video_size ${size} -b:v ${bitrate} -y output-${rate}-${size}.mp4
done
done
exit
和def build(self):
return #object
的默认值调用脚本。
I have tried Builder load