Shell-Script
將帶有空格和引號的參數傳遞給腳本(不引用所有內容)
以下在命令行上效果很好:
$ ffmpeg -i input.m4a -metadata 'title=Spaces and $pecial char'\''s' output.m4a
如何參數化此命令並在腳本/函式中使用它?我想像這樣添加多個元數據標籤:
$ set-tags.sh -metadata 'tag1=a b c' -metadata 'tag2=1 2 3'
更新:
我把我的問題簡化了一點。我實際上想呼叫一個腳本,該腳本呼叫一個帶有參數化命令的腳本。
這是我的確切案例:
此函式將文件轉換為有聲讀物格式(在 .profile 中定義):
# snippet of .profile convert_to_m4b () { FILE="$1" BASENAME=${FILE%.*}; shift ffmpeg -i "$FILE" -vn -ac 1 -ar 22050 -b:a 32k "$@" tmp.m4a && mv tmp.m4a "$BASENAME.m4b" }; export -f convert_to_m4b
從 download-and-convert.sh 呼叫函式 convert_to_m4b:
#/bin/sh MP3_URL=$1; shift FILENAME=$1; shift if [ ! -f "${FILENAME}.mp3" ]; then curl --location --output "${FILENAME}.mp3" "$MP3_URL" fi convert_to_m4b "${FILENAME}.mp3" "$@"
從 process-all.sh 呼叫 Download-and-convert.sh:
#/bin/sh download-and-convert.sh http://1.mp3 'file 1' -metadata 'title=title 1' -metadata 'album=album 1' download-and-convert.sh http://2.mp3 'file 2' -metadata 'title=title 2' -metadata 'album=album 2' ... ... download-and-convert.sh http://3.mp3 'file N' -metadata 'title=title N' -metadata 'album=album N'
我從 ffmpeg 得到這個錯誤:
[NULL @ 00000000028fafa0] Unable to find a suitable output format for ''@'' '@': Invalid argument
"$@"
如果我在 download-and-convert.sh 中內聯 convert_to_m4b 而不是呼叫該函式,則可以工作。以下不起作用,因為引號失去,導致帶空格的參數被錯誤地拆分:
#/bin/sh ffmpeg -i input.m4a $@ output.m4a
我嘗試了各種引用 的
$@
方法,但這最終也引用'-metadata'
了,因此無法正確辨識命令行參數。我想我只想在每個參數被引用的情況下用引號括起來。這似乎很難做到,因為 bash 在將參數傳遞給腳本/函式之前會去掉引號。
或者有沒有更好的方法來傳遞
-metadata
論點?(如環境變數或文件)
"$@"
只要您始終如一地使用它,就可以完全按照您的意願行事。這裡有一個小實驗給你:
script1.sh
:#! /bin/sh ./script2.sh "$@"
script2.sh
:#! /bin/sh ./script3.sh "$@"
script3.sh
:#! /bin/sh printf '|%s|\n' "$@"
有了這個,爭論一直沒有受到干擾:
$ ./script1.sh -i input.m4a -metadata "title=Spaces and \$pecial char's" output.m4a |-i| |input.m4a| |-metadata| |title=Spaces and $pecial char's| |output.m4a|