Bashスクリプトはプログラムにパスとファイル名を渡します。

Bashスクリプトはプログラムにパスとファイル名を渡します。

私は複数のmp3を1つにマージするmp3wrapというユーティリティを使用します。 「track 1.mp3」、「track 2.mp3」、「track 3.mp3」の3つのファイルを含む「album 1」ディレクトリがあるとします。次のコマンドを実行します。

mp3wrap album\ 1.mp3 album\ 1/*.mp3

「album 1」ディレクトリ(2番目のパラメータ)にある3つのトラックをすべて新しいファイル「album 1.mp3」(最初のパラメータ)にマージします。

私は「Album 2」、「Album 3」などのような多くのディレクトリを持っており、プロセスを自動化するスクリプトを作成したいと思います。私はこれを試しました:

for i in album*
do
  mp3wrap $i.mp3 $i/*.mp3
done  

しかし、エラーが発生しました。

1.mp3: No such file or directory

私のスクリプトは、$ iを2つの別々のパラメータに渡される「album 1.mp3」に拡張したようです。検索して読んだ後、次のような結果が出ました。

for i in album*
do
  mp3wrap "${i}.mp3" "${i}/*.mp3"
done  

これでエラーメッセージは表示されませんが、mp3wrapプログラムに「使用中」ページが表示されます。コマンドラインでコマンドを実行するときとは異なる引数を受け取ることは明らかですが、bashスクリプトが実行されたときに実際のコマンドラインがどのように見えるかを確認する方法がわかりません。

私は何が間違っていましたか?助けてくれてありがとう!

答え1

あなたはそれに非常に近いです。正しいコードは次のとおりです。

for i in album*
do
    mp3wrap "${i}.mp3" "${i}"/*.mp3
done

最初の問題を回避するには、変数とパラメータをほぼ常に引用する必要があります。対照的に、シェルのグロービング文字は似ています*が、?そうしてはいけません。そうでなければ、特別な意味を失います。

関連情報