简化循环 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

一个简单的 shell 循环:

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 -e在运行这些循环之前。set -e如果发生错误,将终止脚本,并将set -u未设置变量的扩展视为错误(例如,用于捕获任何拼写错误的变量名称)。

相关内容