배열을 분할할 때 출력은 변수에 문자열로 캡처됩니다.
슬라이스를 직접 사용하는 경우 별도의 항목이 됩니다.
문자열로 변환하지 않고 변수에 슬라이스 배열을 저장하는 방법은 무엇입니까?
이 문제를 해결하는 다른 방법이나 방법이 있습니까?
예:
# setting IFS to this, no need to quote anything
IFS=$'\n'
mapfile -t arr < <(for i in {1..6}; do echo $i; done)
declare -p arr
declare -a arr=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6")
# $() or `` give the same results
slc=`echo ${arr[@]:0:3}`
# proving that when the slice is saved as a var, it's a string
for i in $slc; do echo $i; done
1 2 3
# proving that when the slice is used directly the items are separate
for i in ${arr[@]:0:3}; do echo $i; done
1
2
3
IFS=$'\n'
따옴표 유무에 관계없이 결과가 동일한 경우 허용되는 답변과 함께 작동합니다 .
IFS=$'\n'
slc=(${arr[@]:0:3})
for i in ${slc[@]}; do echo $i; done
1
2
3
답변1
존재하다:
echo ${arr[@]:0:3}
첫째, 따옴표를 잊었습니다. 이는 확장이 분할+glob(사용 IFS=$'\n'
, 개행에서 여전히 분할, 여전히 globbing 수행) 의 영향을 받고 echo
임의 데이터에 사용할 수 없는 것을 사용한다는 것을 의미합니다.
echo
여러 인수가 전달되고(슬라이스의 요소는 추가로 분할+glob의 영향을 받음) 공백으로 구분하여 인쇄합니다.
그리고:
var=`echo...`
(그런데 이것은 사용해야 하는 더 이상 사용되지 않는 명령 대체 형식입니다 var=$(echo...)
.)
쉘은 이 출력(후행 줄 바꿈 제외)을 다음으로 수집합니다.스칼라echo
이는 스칼라 변수 할당 구문이기 때문에 어쨌든 각 요소가 시작하고 끝나는 위치에 대한 정보는 모든 것을 스트림에 묶은 이후 오랫동안 손실되었습니다.
슬라이스를 변수에 저장하려면 배열 변수가 필요하고 배열 할당 구문을 사용합니다.
$ arr=( '*' $'\n' '' 'element '{4..6} ) # ¹
$ slc=( "${arr[@]:0:3}" )
$ typeset -p arr slc
declare -a arr=([0]="*" [1]=$'\n' [2]="" [3]="element 4" [4]="element 5" [5]="element 6")
declare -a slc=([0]="*" [1]=$'\n' [2]="")
당신도 마찬가지입니다:
@slc = @arr[0..2] # in perl
slc = $arr( `{seq 3} ) # in rc
set slc $arr[1..3] # in fish
slc=( "${arr[1,3]}" ) # in yash
slc=( "${(@)arr[1,3]}" ) # in zsh
그리고 요소를 반복합니다.
for i in "${slc[@]}"; do
something with "$i"
done
또는 별칭을 readarray -td '' arr < <(printf '%s\0' '*' $'\n' '' 'element '{4..6}
사용해야 readarray
하거나 이름을 잘못 지정해야 하는 경우 mapfile
bash 변수나 내장 매개변수는 NUL 문자를 포함할 수 없다는 사실을 활용하세요.