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"

하나읽다호출은 전체 표준 입력이 아닌 한 줄에서만 작동합니다.

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)에서 작동하는 내가 생각해낸 솔루션도 게시하겠다고 생각했습니다. 이름에 공백이 있는 파일 하나와 -.

바꾸다

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

명령 대체를 사용하여 배열을 만들고 채우십시오.

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

참고: 이름에 개행 문자가 포함된 파일 이름에는 작동하지 않습니다.

관련 정보