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
ls
ls
つまり、まったく使う必要はありません(視力検査のみ)。
cd
各反復ごとにディレクトリに入るには、サブシェルcd
で実行し、そこで実行する必要があるすべての操作を実行します。これにより、cd
現在の作業ディレクトリがサブシェルにローカルであるため、戻る必要はありません。
for dirpath in */; do
( cd -- "$dirpath" && some-command )
done
cd
現在の作業ディレクトリを変更する必要がある場合にのみ入力してくださいsome-command
。ほとんどの作業は元の作業ディレクトリで実行できます。