var로 설정된 경우 슬라이스 배열의 출력을 문자열이 아닌 별도의 항목으로 어떻게 저장할 수 있나요?

var로 설정된 경우 슬라이스 배열의 출력을 문자열이 아닌 별도의 항목으로 어떻게 저장할 수 있나요?

배열을 분할할 때 출력은 변수에 문자열로 캡처됩니다.

슬라이스를 직접 사용하는 경우 별도의 항목이 됩니다.

문자열로 변환하지 않고 변수에 슬라이스 배열을 저장하는 방법은 무엇입니까?

이 문제를 해결하는 다른 방법이나 방법이 있습니까?

예:

# 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하거나 이름을 잘못 지정해야 하는 경우 mapfilebash 변수나 내장 매개변수는 NUL 문자를 포함할 수 없다는 사실을 활용하세요.

관련 정보