예를 들어, 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