必要なものに近いが完全に正確ではない多数の回答を読んでおり、これを自分のニーズに合わせて調整する方法がわかりません。
ソースフォルダをパラメータとして使用し、そのフォルダ内の各ファイル(特定の種類)に対して一連の操作を実行するbashスクリプトを作成したいと思います。
src_dir=$1
for file in $src_dir/*.jpg; do
filename=`basename "$file"`
basename="${filename%.*}"
...
done
src_dir に空白がない場合は動作しますが、空白がある場合はどのように動作するかわかりません。一般的"$src_dir"
に動作しますがfor file in
。
編集:拡張する必要がある変数を含むパスを渡すことができることを知っておく必要があります(etc $HOME
、$MY_PROJECT_PATH
単一のティックも理想的ではありません)。
答え1
引用符で動作しないと言って引用したとします。全体的な $src_dir/*.jpg
少量。はい。*
引用符で囲まれた文字列はワイルドカード文字ではなく、機能しません。
しかし、引用だけで$src_dir
動作します。
src_dir=$1
for pathname in "$src_dir"/*.jpg; do
name_noext=$( basename -- "$pathname" .jpg )
...
done
これ*
により、シェルはそれをワイルドカード文字として使用します。
編集内容は次のとおりです。たとえば、スクリプトを呼び出すときに$HOME
以下を使用しているとします。拡張HOME
リテラル文字列ではなく変数です$HOME
。文字列が$HOME
変数であるか、ディレクトリのリテラル名(技術的に可能であるか)を決定する必要があるなど、スクリプトが指定されたディレクトリパスにリテラル変数名が含まれているかどうかをテストする必要がある場合、これは驚くべき問題になります。これは$src_dir
for ループの拡張とは無関係です。
答え2
二重引用符が必要ですsrc_dir
。また、任意の変数でシェルを汚染しないようにするには、サブシェルを使用します。(src_dir=$1; for file in "$src_dir"/*.jpg; do ... done)