Bash에서 배열로 구분 된 문자열 읽기


206

공백으로 구분 된 문자열이 포함 된 변수가 있습니다.

line="1 1.50 string"

해당 문자열을 공백으로 구분 기호로 분할하고 결과를 배열에 저장하여 다음을 수행하려고합니다.

echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}

출력

1
1.50
string

어딘가에서 작동하지 않는 솔루션을 찾았습니다.

arr=$(echo ${line})

이 후에 위의 echo 문을 실행하면 다음과 같은 결과가 나타납니다.

1 1.50 string
[empty line]
[empty line]

나는 또한 시도했다

IFS=" "
arr=$(echo ${line})

같은 결과로. 누군가 도와 줄 수 있습니까?


유닉스 및 리눅스 스택 교환 : herestring과 함께 sed 사용 (<<<) 및 read -a 에서이 답변을 참조하십시오 . set -f; arr=($string); set +f보다 빠릅니다 read -r -a <<< $string.
codeforester 2016 년

답변:


331

문자열을 배열로 변환하려면

arr=($line)

또는

read -a arr <<< $line

트릭을 수행하므로 따옴표를 사용하지 않는 것이 중요합니다.


7
그리고 당신의 아름다운 새 배열의 상태 점검을하기 위해 :for i in ${arr[@]}; do echo $i; done
Banjer

5
또는 그냥echo ${arr[@]}
Banjer

13
$line글러브 문자가 있으면 두 가지 방법 모두 실패 할 수 있습니다 . mkdir x && cd x && touch A B C && line="*" arr=($line); echo ${#arr[@]}제공 3
Tino

3
declare -a "arr=($line)"IFS인용 문자열 안의 구분 기호 를 무시합니다
Dave

4
@Tino No. line='*'이면 read -a arr <<<$line항상 작동하지만 arr=($line)실패합니다.
Johnny Wong

39

이 시도:

arr=(`echo ${line}`);

5
좋음-이 솔루션은 Z 쉘에서도 작동하며 위의 다른 접근법 중 일부가 실패합니다.
Keith Hughitt

작동합니다. 왜 작동하는지 설명해 주시겠습니까?
smartwjw

2
비고 : 라인에 '*'가있는 경우에도 작동하지 않습니다.line='*'
Johnny Wong

34

에서 : arr=( $line ). "분할"은 "글로브"와 관련이 있습니다.
와일드 카드 ( *, ?[])는 일치하는 파일 이름으로 확장됩니다.

올바른 해결책은 약간 더 복잡합니다.

IFS=' ' read -a arr <<< "$line"

글 로빙 문제가 없습니다. 분할 문자는 $IFS변수에 인용 된로 설정됩니다 .


5
이것이 정답입니다. 허용 된 답변 의 진술 arr=($line)은 글 로빙 문제로 고통받습니다. 예를 들어 다음을 시도하십시오 .. line="twinkling *"; arr=($line); declare -p arr
codeforester

인용 부호는 herestring의 경우 선택 사항 <<<이지만 일관성과 가독성을 위해 큰 따옴표를 사용하는 것이 좋습니다.
codeforester

6

매개 변수 확장이 필요한 경우 다음을 시도하십시오.

eval "arr=($line)"

예를 들어 다음 코드를 사용하십시오.

line='a b "c d" "*" *'
eval "arr=($line)"
for s in "${arr[@]}"; do 
    echo "$s"
done

경우 현재 디렉토리가 파일을 포함 a.txt, b.txt그리고 c.txt다음 출력을 생성 할 코드를 실행.

a
b
c d
*
a.txt
b.txt
c.txt

-9
line="1 1.50 string"

arr=$( $line | tr " " "\n")

for x in $arr
do
echo "> [$x]"
done

루핑이 잘못되었습니다. 배열을 잘게 분할하고 파이프 tr가 불필요하지만 "${arr[@]}"대신 루프를 반복해야합니다.$arr
Zorf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.