Bashで複数のmkdirとシンボリックリンクを繰り返す単純化

Bashで複数のmkdirとシンボリックリンクを繰り返す単純化

私は次のことをしています

# Mount cache directories

mkdir -p $SHARED_VOL/track/$TRACK/.gradle
rm -rf ~/.gradle
ln -sf $SHARED_VOL/track/$TRACK/.gradle ~/

mkdir -p $SHARED_VOL/track/$TRACK/.m2
rm -rf ~/.m2
ln -sf $SHARED_VOL/track/$TRACK/.m2 ~/

mkdir -p $SHARED_VOL/track/$TRACK/.mvn
rm -rf ~/.mvn
ln -sf $SHARED_VOL/track/$TRACK/.mvn ~/

mkdir -p $SHARED_VOL/track/$TRACK/.sbt
rm -rf ~/.sbt
ln -sf $SHARED_VOL/track/$TRACK/.sbt ~/

mkdir -p $SHARED_VOL/track/$TRACK/.ivy2
rm -rf ~/.ivy2
ln -sf $SHARED_VOL/track/$TRACK/.ivy2 ~/

['.m2', '.mvn', '.gradle']今度は同じことをするループのように、配列のディレクトリだけに言及できる簡単な方法でそれを再フォーマットしたいと思います。どうすればいいですか?

ベストアンサー1

シンプルなシェルループ:

for subdir in .gradle .m2 .mvn .sbt .ivy2; do
    mkdir -p "$SHARED_VOL/track/$TRACK/$subdir"
    rm -rf "$HOME/$subdir"
    ln -s "$SHARED_VOL/track/$TRACK/$subdir" "$HOME"
done

bashたとえば、別の配列を使用したい場合:

dirs=( .gradle .m2 .mvn .sbt .ivy2 )

for subdir in "${dirs[@]}"; do
    mkdir -p "$SHARED_VOL/track/$TRACK/$subdir"
    rm -rf "$HOME/$subdir"
    ln -s "$SHARED_VOL/track/$TRACK/$subdir" "$HOME"
done

または次の場合/bin/sh

set -- .gradle .m2 .mvn .sbt .ivy2

for subdir do
    mkdir -p "$SHARED_VOL/track/$TRACK/$subdir"
    rm -rf "$HOME/$subdir"
    ln -s "$SHARED_VOL/track/$TRACK/$subdir" "$HOME"
done

さらに安全のために、これらのループを実行する前におよびset -u/または実行したい場合があります。エラーが発生すると、スクリプトが終了し、設定されていない変数の拡張がエラーとして処理されます(たとえば、スペルが正しくない変数名をキャッチするため)。set -eset -eset -u

おすすめ記事