Bash에서 배열로 구분 된 문자열 읽기 저장하여 다음을

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

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})

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



답변

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

arr=($line)

또는

read -a arr <<< $line

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


답변

이 시도:

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


답변

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

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

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

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


답변

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

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


답변

line="1 1.50 string"

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

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


답변