bash配列でstdinを読む

bash配列でstdinを読む

私は次のことを達成したいと思います:

list=()
while read i; do
  list+=("$i")
done <<<"$input"

そして

IFS=$'\n' read -r -a list <<<"$input"

私は何が間違っていましたか?

input=`/bin/ls /`

IFS=$'\n' read -r -a list <<<"$input"

for i in "${list[@]}"; do
  echo "$i"
done

リストは印刷する必要があります/が、最初の項目だけがインポートされます。

答え1

使用する必要がありますマップファイル(またはその同義語配列を読む、)で紹介bash 4.0

mapfile -t list <<<"$input"

一つ読む呼び出しは標準入力全体ではなく、1行でのみ機能します。

read -a list標準の最初の行の内容で配列を埋めますlist。あなたの場合、bin「リスト」配列の唯一の要素を取得します。

答え2

bashサポートされていないバージョンの場合mapfile

IFS=$'\n' read -ra list -d '' <<< "$input"

問題を解決しなければならない

答え3

Bashバージョン3(および4)用のソリューション

私は偶然Bash 3を実行しているCentOS 5システムにログインし、解決策を研究しています。私はすでにcuonglmの答えを賛成していますが、Bash 3(および4)で動作する私が思いついた解決策も投稿すると思いました。名前にスペースが含まれている1つのファイルと-

変える

IFS=$'\n' read -r -a list <<<"$input"

コマンド置換を使用して配列を作成して埋めます。

IFS=$'\n' # split on newline only
set -f    # disable globbing
list=($(printf "%s" "$input"))

注:名前に改行文字を含むファイル名は機能しません。

関連情報