sdb
다음 목록은 과 사이의 마커를 나타냅니다 sd$MAX
( MAX
범위는 c
- 일 수 있음 z
).
예를 들어:
MAX=z
list=$(eval echo sd{b..$MAX})
echo $list
문자열은 다음과 같습니다. (예)
sdb sdc sdd sde sdf sdg sdh sdi sdj sdk sdl sdm sdn sdo sdp sdq sdr sds sdt sdu sdv sdw sdx sdy sdz
내 질문은 각 루프마다 목록을 다음 문자열로 이동하는 방법입니다.
예:
for i in disk1 disk2 disk3 disk4 ..................
do
echo $i <...syntax...>
done
예상 출력
disk1 sdb
disk2 sdc
disk3 sdd
disk4 sde
.
.
.
답변1
당신이 사용할 수있는간접적인값 대신 배열의 인덱스를 직접 반복합니다.
주어진
$ list=(sd{a..f})
$ echo "${list[@]}"
sda sdb sdc sdd sde sdf
그 다음에
$ for i in "${!list[@]}"; do printf '%s %s\n' "disk${i}" "${list[$i]}"; done
disk0 sda
disk1 sdb
disk2 sdc
disk3 sdd
disk4 sde
disk5 sdf
정말로 원하는 방식으로 수행하려면 루프하려는 문자열 요소에서 사용 가능한 정수 인덱스를 추출해야 합니다. 예를 들어 disk
매개변수 대체를 사용하여 선행 문자열을 제거합니다.
for d in disk1 disk2 disk3 disk4; do printf '%s %s\n' "$d" "${list[${d##disk}]}"; done
disk1 sdb
disk2 sdc
disk3 sdd
disk4 sde
답변2
배열 변수를 사용하는 것이 더 좋습니다.
#!/bin/bash
MAX=d
eval list=\( $(echo sd\{b..$MAX\})\)
eval disks=\( $(echo disk\{1..${#list[@]}\}) \)
for((i=0;i<=${#list[@]};i++));do
echo "${disks[i]} ${list[i]}"
done
실행 시:
$ ./script
disk1 sdb
disk2 sdc
disk3 sdd
필요에 따라 조정하십시오.
답변3
Bash에는 문제를 함께 해결하는 두 가지 간단하고 간단한 내장 함수인 set
및 가 있습니다 shift
.
set $list
$list의 각 요소를 bash에 할당합니다.
위치 매개변수.
shift
모든 위치 매개변수의 이름을 $n+1에서 $n으로 변경하여 효과적으로 $1을 제거하고 모든 위치 매개변수를 앞으로 "이동"합니다.
따라서 귀하의 예에서 귀하의 선언 echo $i <...syntax...>
은
echo $i " " $1; shift
.
printf
그런데 개인적으로 저는 대신 bash를 사용하겠습니다 echo
( echo
문제를 일으킬 수 있는 다른 곳을 참조하세요).printf "%s %s\n" $i $1; shift
답변4
디스크 열에 대한 카운터를 구축하여 목록을 채우고 내보내기로 사용할 문자열을 바꿀 수 있습니다.
-bash-4.4$ MAX=z
-bash-4.4$ list=$(eval echo sd{b..$MAX})
-bash-4.4$ echo $list
sdb sdc sdd sde sdf sdg sdh sdi sdj sdk sdl sdm sdn sdo sdp sdq sdr sds sdt sdu sdv sdw sdx sdy sdz
-bash-4.4$ disk=1 ; for i in $(echo $list) ; do echo $i | sed 's/sd./disk'$disk'\t &/' ; disk=$(($disk +1)) ; done
disk1 sdb
disk2 sdc
disk3 sdd
disk4 sde
disk5 sdf
disk6 sdg
disk7 sdh
disk8 sdi
disk9 sdj
disk10 sdk
disk11 sdl
disk12 sdm
disk13 sdn
disk14 sdo
disk15 sdp
disk16 sdq
disk17 sdr
disk18 sds
disk19 sdt
disk20 sdu
disk21 sdv
disk22 sdw
disk23 sdx
disk24 sdy
disk25 sdz
-bash-4.4$
여기서는 변수 디스크 정의를 사용하여 구분 기호로 & a \t(탭)를 사용합니다. 공간이나 다른 것이 마음에 들면 필요에 맞게 조정할 수 있습니다.
이 출력을 파일로 얻으려면 출력 리디렉션을 추가하고 물론 스크립트에서 다음과 같은 코드를 사용해야 할 수도 있습니다( ; 제외).
disk=1
for i in $(echo $list)
do
echo $i | sed 's/sd./disk'$disk'\t &/' ; disk=$(($disk +1))
done > file
이해하기 쉬운 방법은 다음과 같습니다. 더 나은 접근 방식은 sed 대신 bash 대체를 사용하는 것입니다. bash 메서드 ${!list[@]} & printf 명령 또는 ${parameter/pattern/string} 대체 고급 기능을 참조하세요.