Bash에서 배열 값을 이동하는 방법

Bash에서 배열 값을 이동하는 방법

예를 들어, 6개의 마운트 지점 폴더를 구축하려고 합니다.

/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg

그래서 우리는 배열을 사용하여 이 간단한 bash 스크립트를 작성했습니다.

folder_mount_point_list="sdb sdc sdd sde sdf sdg"

folderArray=( $folder_mount_point_list )

counter=0
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
do
folder_name=${folderArray[counter]}
mkdir /data/$folder_name
let counter=$counter+1
done

이제 우리는 없이 코드를 변경하고 싶습니다.카운터그리고Let=$counter=카운터+1

다음 배열 값을 얻기 위해 배열의 각 루프를 이동하는 것이 가능합니까?

좋다

${folderArray[++]}

답변1

제목의 질문에 대답하려면 하위 문자열/하위 배열 표기법을 사용하여 배열을 "이동"할 수 있습니다. shift그 자체로는 위치 매개변수에서만 작동합니다.

$ a=(a b c d e)
$ a=("${a[@]:1}")
$ echo "${a[@]}"
b c d e

마찬가지로 배열의 마지막 항목을 "팝"하려면: a=("${a[@]:0:${#a[@]} - 1}" )또는unset "a[${#a[@]}-1]"

따라서 원한다면 다음과 같이 할 수 있습니다.

a=(foo bar doo)
b=(123 456 789)
while [ "${#a[@]}" -gt 0 ]; do
    echo "$a $b"
    a=("${a[@]:1}")
    b=("${b[@]:1}")
done

그러나 배열이 손상되고 "이동" 할당으로 인해 데이터가 불필요하게 복사될 수 있으므로평소대로 색인을 생성하는 것이 더 나을 수도 있습니다..

a=(foo bar doo)
b=(123 456 789)
i=0
while [ "$i" -lt "${#a[@]}" ]; do
    echo "${a[i]} ${b[i]}"
    i=$((i+1))
done

또는 항목의 순서가 중요하지 않은 경우 대신 연관 배열을 사용할 수 있습니다. "${!arr[@]}"키는 지정되지 않은 순서로 제공됩니다.아니요할당된 순서는 다음과 같습니다.

declare -A arr=([foo]=123 [bar]=456 [doo]=789)
for k in "${!arr[@]}"; do
    echo "$k ${arr[$k]}"
done

답변2

일반적인 답변. 다음과 같이 배열을 정의하는 것은 의미가 없습니다.

folder_mount_point_list="sdb sdc sdd sde sdf sdg"
folderArray=( $folder_mount_point_list )

다음을 수행할 수 있습니다.

folderArray=(sdb sdc sdd sde sdf sdg)

이제 귀하의 질문에 답해 보겠습니다.

set -- sdb sdc sdd sde sdf sdg
for folder_name; do
    mkdir "/data/$folder_name"
done

또는

set -- sdb sdc sdd sde sdf sdg
while [ $# -gt 0 ]; do
    mkdir "/data/$1"
    shift
done

답변3

이동하지 않고 모든 값을 간단히 반복할 수 있습니다.

folderArray=(sdb sdc sdd sde sdf sdg)

for folder in "${folderArray[@]}"; do
    mkdir "/data/$folder"
done

답변4

당신이 묻는 질문은 ++.

이와 같이:

folderArray=( sdb sdc sdd sde sdf sdg  )

counter=0

for i in disk1 disk2 disk3 disk4 disk5 disk6; do
    folder_name=${folderArray[counter++]}
    echo mkdir /data/$folder_name
done

배열의 인덱스(그 안의 내용 [])는 산술적 맥락에 있으므로 사후 증분( ++)이 작동합니다.


제목의 질문에서는 용어를 사용합니다 shift. 위치 매개변수와 같은 이동은 배열을 다시 작성하여 수행할 수 있습니다(느린 프로세스).

folderArray=( sdb sdc sdd sde sdf sdg  )

shiftArray=( "${folderArray[@]}" )

counter=0
for i in disk1 disk2 disk3 disk4 disk5 disk6; do
    echo mkdir /data/$shiftArray

    shiftArray=( "${shiftArray[@]:1}" )

done

그러나 배열 인덱스를 직접 사용하는 것이 더 간단해 보입니다.

folderArray=( sdb sdc sdd sde sdf sdg  )

for((i=0;i<${#folderArray[@]};)); do
    echo mkdir /data/"${folderArray[i++]}"
done

관련 정보