programing

공백으로 구분된 문자열을 Bash에서 배열로 읽기

codeshow 2023. 4. 12. 22:41
반응형

공백으로 구분된 문자열을 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})

같은 결과를 낳았습니다.누가 좀 도와줄래요?

문자열을 배열로 변환하려면 문자열에서 배열을 생성하여 문자열이 다음 항목에 따라 자연스럽게 분할되도록 합니다.IFS(내부 필드 구분 기호) 변수. 기본적으로 공백 문자입니다.

arr=($line)

스트링을 스틴에 전달하거나read명령어를 지정합니다( )<<<) 연산자:

read -a arr <<< "$line"

첫 번째 예에서는 따옴표를 주위에 사용하지 않는 것이 중요합니다.$line스트링을 여러 요소로 분할할 수 있기 때문입니다.

참고 항목: https://github.com/koalaman/shellcheck/wiki/SC2206

입력:arr=( $line ). "split"은 "glob"과 관련되어 있습니다.
와일드카드(*,?그리고.[])가 일치하는 파일명으로 전개됩니다.

올바른 솔루션은 조금 더 복잡할 뿐입니다.

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

글로벌 문제는 없습니다.스플릿 문자는 다음과 같이 설정됩니다.$IFS, 변수는 따옴표로 묶습니다.

이것을 시험해 보세요.

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

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

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

언급URL : https://stackoverflow.com/questions/9293887/reading-a-space-delimited-string-into-an-array-in-bash

반응형