2014-11-08 68 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