簡體   English   中英

避免bash頭痛

[英]Escape a variable in bash headache

我創建了一個腳本,以便自動將攝像機的視頻從DV轉換為mkv。但是,由於它無法正確轉義filename變量,因此無法使其正常工作。 腳本是:

#!/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的算術運算符((...))
  • 不使用子shell(在您的版本中, while循環在子shell中執行)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM