我有一个脚本,它使用来自命令行的多个(即位置)参数,并在其中循环for
遍历这些参数:
for i in "$@"; do
...
done
这意味着参数将$i
按照在命令行上指定的顺序逐个填充。
这似乎意味着不可能选择当前未填充的参数 $i
。
例如,在我的脚本的下面一行中,我需要引用两个不同的变量,在循环之外它们分别for
是和:$1
$2
$1
ffmpeg -i "$i" -i "$i" ... "${i%.*}.mp4"
该脚本的执行格式如下:
./script.sh image.jpg *.flac
...但据我了解,这个问题甚至适用于不支持 glob 的脚本。
是否可以for
根据需要从循环中访问位置参数,而不是简单地按照指定顺序访问?
答案1
我最终还是弄明白了这一点,尽管我不认为这是一个完美的答案,因为它不满足能够从循环中引用参数的要求for
。
从这个意义上说,我认为这个答案更像是一种解决方法,我非常高兴有人能来以更全面的方式直接回答这个问题。无论如何,这是一种适用于我当前脚本的解决方法。
img="$1"
shift
for i in "$@"; do
...
ffmpeg -i "$img" -i "$i" ... "${i%.*}.mp4"
...
done
据我所知,这是通过将第一个参数分配给循环$img
外的变量来实现的for
。$img
脚本中的每个实例都由shift
(与 相同shift 1
)处理,然后丢弃,然后再转到下一个实例。
一旦从参数列表中删除所有 $img 参数,循环for
就会使用来$@
正常循环遍历剩余的参数。
然后可以使用以下命令调用该脚本:
./script.sh customimage.png *.flac
或者对于$img
变量的多个实例:
./script.sh customimage.png custom-image2.jpg *.flac