[...]
for i in `cat list.txt`
次の構文は使用しないでください。
for i in $(command); do ...; done # or
for i in `command`; do ...; done
この構文は、コマンドの出力を行単位ではなく単語単位で読み取ります。これにより、予期しない問題が発生することがよくあります (たとえば、行にスペースが含まれている場合や、行を項目のように読み取りたい場合など)。
常によりスマートなソリューションがあります:
command|while read -r; do ...; done # better general case to read command output in a loop
while read -r; do ...; done <<< "$(command)" # alternative to the previous solution
while read -r; do ...; done < <(command) # another alternative to the previous solution
for i in $DIR/*; do ...; done # instead of "for i in $(ls $DIR); do ...; done
for i in {1..10}; do ...; done # instead of "for i in $(seq 1 10); do ...; done
for (( i=1 ; i<=10 ; i++ )); do ...; done # such that the previous command
while read -r; do ...; done < file # instead of "cat file|while read -r; do ...; done"
while read -r || [[ -n $REPLY ]]; do ...; done < file # Same as before but also deal with files that doesn't have EOF.
# dealing with xargs or find -exec sometimes...
# ...
このテーマと繰り返し発生するエラーについて詳しく説明したコースを書きましたが、残念ながらフランス語で:)
元の質問に答えるには、次のようなものを使用できます。
Convert() {
ffmpeg -i “$1” -vcodec mpe4 -sameq -acodec aac -strict experimental “$1.mp4”
}
Convert_loop(){
while read -r; do
Convert $REPLY
done < $1
}
Convert_loop list.txt