2

なぜこれは何もリストしないのですか?ありがとうございました

FOLDER=()

ls /tmp/backup/ | while read DIR
do
    FOLDER+=("$DIR")
done

echo ${FOLDER[1]}
4

4 に答える 4

8

分析

あなたの例は失敗するように設計されています。例えば:

  • の出力を解析しないでください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
于 2012-07-20T17:24:58.473 に答える
3

サブシェルの問題を回避するには(ディエゴの回答を参照)、次のようなこともできます

while ....
done <<<$(ls)
于 2012-07-20T17:21:38.603 に答える
2

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 では)ファイル名にスペースがありません。それはあなたの健康に悪いです:)

于 2012-07-20T17:18:32.520 に答える
0

他の人がすでに述べたように、上記のコードの問題の 1 つは、サブシェル内の変数の変更です。もう 1 つは+=、配列の作成に使用しています。残念ながら、これはゼロ番目の要素を文字列として追加するだけなので、FOLDERS[1]未定義のままです。

于 2012-07-20T17:41:02.733 に答える