入れ子になったforループで同じ値をスキップする

入れ子になったforループで同じ値をスキップする

同じ値をスキップしながら、複数のループ(単純化のためにここでは2つのループを使用)の値を繰り返してbashにディレクトリを作成したいと思います。デモの例は次のとおりです。

for i in 1 2 3; do for j in 1 2 3; do mkdir $i$j; done, done

これにより、名前の付いたフォルダーが提供されますが、番号の11, 12, 13, 21, 22, 23, 31, 32, 33異なるフォルダーのみを持ちたいので、このフォルダーに入れないでください11。同じ値をスキップする便利なforループオプションはありますか?2233

または、すべてのフォルダを作成して複数の値を持つフォルダを削除することもできますが、複数のアイテムを含む複数のループがある場合、これは非常に非効率的に見えます。

答え1

注:下のループは中括弧拡張を使用して1から9まで実行されます。使用{1..3}または1 2 3実行正確に質問のように。

ディレクトリを作成する前に、比較して$i異なることを確認してください$j

for i in {1..9}; do
    for j in {1..9}; do
        [ "$i" -ne "$j" ] && mkdir "$i$j"
    done
done

この-neテストは算術不等式をテストします。文字列を繰り返すには、代わりにを使用してください!=。テストが真($iそして$j異なる場合)が使用されますmkdir

[ "$i" -ne "$j" ] && mkdir "$i$j"早く書く方法です。

if [ "$i" -ne "$j" ]; then
    mkdir "$i$j"
fi

次の名前のすべての11ディレクトリを削除するには22:

for i in {1..9}; do
    rmdir "$i$i"
done

これはディレクトリが空であると仮定します。rm -rf "$i$i"空でない場合に使用されます。

関連情報