bash + 목록의 다음 문자열로 전환하는 방법

bash + 목록의 다음 문자열로 전환하는 방법

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} 대체 고급 기능을 참조하세요.

관련 정보