문자열이 있다고 가정 해 봅시다 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