bash에서 줄 끝 구분 기호로 문자열을 분할하는 방법은 무엇입니까?

bash에서 줄 끝 구분 기호로 문자열을 분할하는 방법은 무엇입니까?

문자열이 있다고 가정 해 봅시다 x.

/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file

각 파일이 나열될 배열을 얻고 싶습니다. 내 현재 코드는 다음과 같습니다

readarray -t y <<<"$x"

공백이 포함된 파일 이름을 얻는 경우를 제외하고는 잘 작동합니다(예 (copy) file: Readarray도 이를 분할하고 반환되는 것은 y다음과 같은 배열입니다).

/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy)
file

파일 이름 분할을 방지하는 방법은 무엇입니까?

답변1

주석에서 제안한 것처럼 이 질문을 끝내려면 배열이 "분할"된 것처럼 보이는 이유는 배열이 readarray에 의해 분할되었기 때문이 아니라 배열을 인쇄하는 방식 때문입니다. 배열에 실제로 무엇이 포함되어 있는지 의심스러울 때는 declare -p인쇄용 -p를 사용하거나 printf큰따옴표를 사용하는 것이 좋습니다.

실제로 변수를 인쇄하든 스크립트에서 사용하든 상관없이 항상 큰따옴표로 변수를 인용해야 합니다.

다음 테스트를 참조하세요.

$ a="/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file"

$ echo "$a"
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file

$ echo $a
/media/root/persistence/file /media/root/persistence/anotherfile /media/root/persistence/(copy) file

$ readarray -t y <<<"$a"
$ declare -p y
declare -a y=([0]="/media/root/persistence/file" [1]="/media/root/persistence/anotherfile" [2]="/media/root/persistence/(copy) file")

$ printf '%s\n' ${y[@]}
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy)
file

$ printf '%s\n' "${y[@]}"
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file

don_crissti가 언급했듯이 변수를 큰따옴표로 묶지 않았기 때문에 이러한 동작이 발생합니다.

항상 변수를 인용하는 것의 중요성을 강조하려면 다음 추가 테스트를 참조하세요.

$ b=" "

$ [ $b = " " ] && echo "ok" || echo "not ok"
bash: [: =: unary operator expected
not ok

$ [ "$b" = " " ] && echo "ok" || echo "not ok"
ok

관련 정보