编辑我已经分离了我的循环,所以我不会遇到一些奇怪的嵌入式循环垃圾,并且仍然会遇到段错误。我在下面更新了我的代码块。不幸的是,添加回声不再起作用,所以我永远无法做到“我做到了!” 回显命令。
我有一个 shell 脚本,它从脚本的参数中获取文件,将它们分成视频和图像序列,然后将它们添加到列表中。该列表稍后将传递给 ffmpeg 进行批量编码。奇怪的是,我设置的循环会给出“Segmentation Fault 11”,除非我在循环的开头添加一个 echo 语句。一探究竟:
## Build list of files to encode, using only files from approved extensions list.
argument_files=()
filelist=()
echo "Building file list."
for argument in $@; do
OLDIFS=$IFS
IFS=$'\n'
argument_files+=($(find "$argument" -type f | grep -e ".*/.*\.\($filters)"))
IFS=$OLDIFS
done
for thisfile in $argument_files; do
echo $thisfile
if [[ "$thisfile" =~ .*\.($sequence_exts) ]]; then
has_sequences="y"
inlist="n"
tempdir=$(dirname "$thisfile")
tempext=$(basename "$thisfile" | sed 's/.*\.\(.*\)/\1/')
tempname=$(basename "$thisfile" | sed 's/\(.*\)\..*/\1/')
collection=$(echo "$tempname" | sed 's/[0-9]*$//')
chartemp=$(echo "$tempname" | grep -o -m 1 -e '[0-9]*$')
if [[ "$chartemp" != [0-9]* ]]; then
continue
fi
charcount=`printf "%02d" ${#chartemp}`
new_path="${tempdir}/${collection}%${charcount}d.${tempext}"
for e in ${filelist[@]}; do
if [[ "$e" == "$new_path" ]]; then
inlist="y"
break
fi
done
if [[ "$inlist" == "n" ]]; then
OLDIFS=$IFS
IFS=$'\n'
filelist+=("$new_path")
IFS=$OLDIFS
fi
elif [[ "$thisfile" =~ .*\.($mov_exts) ]]; then
OLDIFS=$IFS
IFS=$'\n'
filelist+=("$thisfile")
IFS=$OLDIFS
fi
done
echo "I made it!"
顺便说一下,第一个 if 语句用于过滤掉图像序列,并将它们转换为 ffmpeg 想要名称%0Nd.jpg 的格式。它还尝试确保尚未将相同的图像序列添加到批处理列表中。这对我来说真的很hacky。如果是,请道歉。