在猛烈头痛中转义一个变量



我创建了一个脚本,以便自动将相机的视频从DV转换为mkv但是,我无法使其工作,因为它无法正确转义文件名变量。脚本为:

#!/bin/bash
FTITLE="Tapes 2012, Tape 01 - "
i=1;
find ./ -type f -name "dv_*.dv" | while read fname; do
    CTIME=`stat -c %Y ${fname}`
    FNAME="${FTITLE} - ${i}.mkv"
    /usr/bin/ffmpeg -i ${fname} ${x264_OPTIONS} ./"$FNAME"
    let i=$i+1
done

运行脚本时,我看到以下错误:

[NULL @ 0x645f40] Unable to find a suitable output format for '2012,'
2012,: Invalid argument

显然,这是脚本和文件名的问题。我试图逃避它

/usr/bin/ffmpeg -i ${fname} ${x264_OPTIONS} ./""$FNAME""

但它也没有奏效。

使用更多引号!!引用您拥有的每个变量!

代替您的脚本,我会执行以下操作:

#!/bin/bash
ftitle="Tapes 2012, Tape 01 - "
x264_options=( your options here in an array that is good practice "and quote if you have an option with spaces" )
shopt -s globstar
shopt -s nullglob
((i=1))
for fname in **/dv_*.dv; do
   [[ -f $fname ]] || continue
   ctime=$(stat -c %Y "$fname")
   fnameuppercase="$ftitle - $i.mkv"
   /usr/bin/ffmpeg -i "$fname" "${x264_options[@]}" ./"$fnameuppercase"
   ((++i))
done

与您的有几个不同之处:

  • 使用小写变量名称。使用大写变量名称被认为是不好的做法,
  • 在这里毫无用处地使用find,因为你的搜索是如此微不足道:使用 bash 的 glob 代替,
  • 所有变量都正确引用,
  • 选项都在一个数组中(很好的做法!并解决了几乎所有问题),
  • 不使用反引号,而是使用$(...)命令替换,
  • 使用 bash 的算术运算符 ((...))
  • 不使用子外壳(在您的版本中,while循环在子外壳中执行)

相关内容

  • 没有找到相关文章

最新更新