shell - 包含多个变量的循环命令

时间:2017-01-19 12:52:17

标签: bash shell ffmpeg

我从脚本运行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。

2 个答案:

答案 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