スペースと引用符を使用してスクリプトに引数を渡す(すべてを引用しない)

スペースと引用符を使用してスクリプトに引数を渡す(すべてを引用しない)

以下はコマンドラインで正しく機能します。

$ 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

Convert_to_m4b 関数は download-and-convert.sh から呼び出されます。

#/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" "$@"

Download-and-convert.sh は process-all.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それとも主張を伝えるより良い方法はありますか? (例:環境変数またはファイル)

ベストアンサー1

"$@"あなたがそれを守る限り、それはあなたのニーズを完全に満たすでしょう。ここにあなたのための小さな実験があります:

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

おすすめ記事