なぜこれは何もリストしないのですか?ありがとうございました
FOLDER=()
ls /tmp/backup/ | while read DIR
do
FOLDER+=("$DIR")
done
echo ${FOLDER[1]}
あなたの例は失敗するように設計されています。例えば:
ls
。/tmp/backup 内のすべてのエントリがディレクトリであると仮定すると、単純にシェル グロブを使用して配列を設定できます。ファイルとディレクトリ エントリがある場合は、findを使用するか、シェル テスト式を使用して、エントリが実際にディレクトリであることを確認する必要があります。例えば:
# Enable special handling to prevent expansion to a
# literal '/tmp/backup/*' when no matches are found.
shopt -s nullglob
FOLDERS=(/tmp/backup/*)
for folder in "${FOLDERS[@]}"; do
[[ -d "$folder" ]] && echo "$folder"
done
# Unset shell option after use, if desired. Nullglob
# is unset by default.
shopt -u nullglob
サブシェルの問題を回避するには(ディエゴの回答を参照)、次のようなこともできます
while ....
done <<<$(ls)
while
は子シェルで実行され、親の変数 (この場合はFOLDER
. 他の方法を試す必要があります。例えば:
FOLDER=(`ls /tmp/backup`)
echo ${FOLDER[1]}
(そこに2番目のファイルを印刷します)
注: はい、この解決策、スペース、 の使用ls
などの問題を理解しています。 の問題を指摘したかっただけwhile
です。答えを完成させるには、はい、グロビングを使用する必要があります。
for dir in /tmp/backup/* ; do
test -d "$dir" && do_stuff_with_dir("$dir")
done
そして、純粋主義で死なないことによって、通常 (少なくとも UNIX では)ファイル名にスペースがありません。それはあなたの健康に悪いです:)
他の人がすでに述べたように、上記のコードの問題の 1 つは、サブシェル内の変数の変更です。もう 1 つは+=
、配列の作成に使用しています。残念ながら、これはゼロ番目の要素を文字列として追加するだけなので、FOLDERS[1]
未定義のままです。