Bash forループは「順序が間違っている」複数のechoステートメントを実行します。

Bash forループは「順序が間違っている」複数のechoステートメントを実行します。

Bashスクリプトがあります。

for j in "$(ls -d */)"; do 
    echo "$j"
    echo "$j"
done

出力:

dir1/
dir2/
dir3/
dir1/
dir2/
dir3/

私が出力したいのは次のとおりです。

dir1/
dir1/
dir2/
dir2/
dir3/
dir3/

どうすればこのように出力できますか?

(これはおもちゃの例です。本物私が望むのは、ディレクトリにCDを挿入し、何かをし、再びCDを挿入することです。文字列接続を使用して同じことができることに気づきましたが、この動作が混乱しすぎて他の質問が見つかりませんでした。それで尋ねるかと思いました。 )

ベストアンサー1

あなたのループは一つ繰り返します。この繰り返しでは、変数jの値は次のとおりです。

dir1/
dir2/
dir3/

その後、2回出力します。

単一の文字列を繰り返すので、変数はこの値を取得しますls -d */

サブディレクトリを繰り返すには、次を使用します。

for dirpath in */; do
    printf '%s\n' "$dirpath"
    printf '%s\n' "$dirpath"
done

lslsつまり、まったく使う必要はありません(視力検査のみ)。

cd各反復ごとにディレクトリに入るには、サブシェルcdで実行し、そこで実行する必要があるすべての操作を実行します。これにより、cd現在の作業ディレクトリがサブシェルにローカルであるため、戻る必要はありません。

for dirpath in */; do
    ( cd -- "$dirpath" && some-command )
done

cd現在の作業ディレクトリを変更する必要がある場合にのみ入力してくださいsome-command。ほとんどの作業は元の作業ディレクトリで実行できます。

おすすめ記事