2014-11-08 45 views
2

我正在研究以## ARTIST - TRACK.flac格式獲取flac文件的腳本,並且正確地從文件名和標籤中提取信息。我也有一些手動輸入其他信息的標誌。問題是曲目名稱沒有正確標記。看起來,它停止在第一個白色空間,不管我的引用技術如何,然後拋出一堆其他的東西。您會注意到,在標記之前我會回顯出trackname變量,以確保變量是正確的,但標記仍然是關閉的。感謝您的幫助(和任何其他指針)提前!難以在bash腳本中正確傳遞一個變量

#!/bin/bash 
# 
# A flac tagging script 
# 


while getopts :l:y:s:h opt ; 
do 
    case $opt in 
     l) ALBUM="--set-tag=ALBUM=${OPTARG}" ;; 
     y) YEAR="--set-tag=YEAR=${OPTARG}";; 
     s) SOURCE="--set-tag=SOURCE=${OPTARG}" ;; 
     h) echo >&2 "tags flac files in folder with arguments: -r [artist] -l [album] -y [year] -s [source (cdr, promot, etc)]" ;; 
    esac 
    done 

shift $((OPTIND-1)) 

if [ "$1" ] 
then 
    for file 
    do 

     if [ -e "$file" ] 
     then 

      echo >&2 "Tagging file: "$file"" 
      filename=$(basename "$file") 
      extension="${filename##*.}" 
      filename="${filename%.*}" 
      TRACKNAME="${filename##*- }" 
      trackartist="${filename% -*}" 
      TRACKNUMBER="${trackartist% *}" 
      ARTIST="${trackartist##* }" 

      echo >&2 "$TRACKNAME" 
      metaflac \ 
      --set-tag=ARTIST=$ARTIST\ 
      --set-tag=TITLE=$TRACKNAME \ 
      --set-tag=TRACKNUMBER="$TRACKNUMBER" "$ALBUM" "$YEAR" "$SOURCE"\ 
      "$file" 



     else 
      echo >&2 "No such file: "$1"" 
      exit 1 
     fi 
    done 
else 
    echo >&2 "Usage: "$(basename "$0")" INPUTFILE [...]" 
    exit 1 
fi 
+0

我不知道我理解的問題。它停在哪個空間? – Barmar 2014-11-08 22:32:17

+2

'$ ARTIST'或'$ TRACKNAME'是否可以包含空格?然後你需要在'--set-tag ='參數中引用它們。 – Barmar 2014-11-08 22:33:26

回答

0

快速改寫

#!/bin/bash 

tags=() 

while getopts :l:y:s:h opt; do 
    case $opt in 
     l) tags+=(--set-tag=ALBUM="$OPTARG") ;; 
     y) tags+=(--set-tag=YEAR="$OPTARG") ;; 
     s) tags+=(--set-tag=SOURCE="$OPTARG") ;; 
     h) echo >&2 "tags flac files in folder with arguments: -l [album] -y [year] -s [source (cdr, promot, etc)]" ;; 
    esac 
done 

shift $((OPTIND-1)) 

if [ $# -eq 0 ]; then 
    echo >&2 "Usage: $(basename "$0") [options] INPUTFILE [...]" 
    exit 1 
fi 

for file; do 
    if ! [ -e "$file" ]; then 
     echo >&2 "Error: No such file: $1" 
     continue 
    fi 
    if ! [[ $(basename "$file") =~ ([0-9]+)" "(.+)" - "(.+)".flac"$ ]]; then 
     echo >&2 "Error: can't parse filename: $file" 
     continue 
    fi 

    echo >&2 "Tagging file: $file" 
    metaflac "${tags[@]}" \ 
     --set-tag=ARTIST="${BASH_REMATCH[2]}" \ 
     --set-tag=TITLE="${BASH_REMATCH[3]}" \ 
     --set-tag=TRACKNUMBER="${BASH_REMATCH[1]}" \ 
     "$file" 
done 

注:

  • 使用bash的正則表達式匹配,簡化(我希望)解析名
  • 雙qoutes不嵌套雙引號:那麼「嵌套」變量就不會被引用。
  • 不使用ALL_CAPS_VARS:有一天你會使用PATH=/my/file,然後不知道爲什麼你的腳本被打破
+0

謝謝!我避免了正則表達式,因爲我還不明白,這是一個學習練習。我假設bash_rematch與if語句中的()排成一行? if語句傳遞給metaflac行的條件如何?是否僅由bash設計? – 2014-11-15 21:02:27