Shell-Script

將帶有空格和引號的參數傳遞給腳本(不引用所有內容)

  • September 6, 2017

以下在命令行上效果很好:

$ 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|

引用自:https://unix.stackexchange.com/questions/390616