bash_02 for 반복문을 간단히 작성하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: ping, echo
키워드: 브레이스 확장, bash
사용처: IP 주소 목록 등을 브레이스 확장으로 간단히 작성하고 싶을 때


실행예제

$ ./bash-brace.sh
[OK] Ping -> 192.168.2.1
[OK] Ping -> 192.168.2.2
[OK] Ping -> 192.168.2.3
[OK] Ping -> 192.168.2.4
[OK] Ping -> 192.168.2.5

스크립트

#!/bin/bash

# bash 브레이스 확장 {}으로 IP 주소 목록 작성
for ipaddr in 192.168.2.{1..5}  #---------------- 1
do
  ping -c 1 "$ipaddr" > /dev/null 2>&1

  if [ $? -eq 0 ]; then
    echo "[OK] Ping -> $ipaddr"
  else
    echo "[NG] Ping -> $ipaddr"
  fi   
done

   

해설

이 스크립트는 ping 명령어를 대상 IP 주소에 실행해서 그 결과를 OK/NG로 표시합니다. 대상 IP 주소 작성은 bash 브레이스 확장(Brace Expansion)을 이용합니다.

여기서는 브레이스 확장 기능을 위해 스크립트를 간략화해서 ping 명령어를 1회만 실행해서 응답을 확입합니다.

bash 브레이스 확장은 {}로 싼 문자열을 확장하는 문법입니다. 다음 몇 가지 예를 살펴보는데 쉼표로 구분해서 문자열을 나열하는 표현과 점 두 개(..)로 범위를 지정하는 표현이 있습니다. 어느 쪽이라도 직감적으로 알 수 있을 것입니다.

  • bash 브레이스 확장 예

    $ echo index.{php,htm,html}  <-------------- 쉼표로 문자열 지정. 목록을 의미
    index.php index.html index.html
    
    $ echo 192.168.2.{1..5}  <--- 숫자를 점 두 개로 범위 지정. 1에서 5까지를 의미
    192.168.2.1 192.168.2.2 192.168.2.3 192.168.2.4 192.168.2.5
    
    $ echo host-{a..c}.example.com  <-- 문자열을 점 두 개로 범위 지정. a에서 c까지를 의미
    host-a.example.com host-b.example.com host-c.example.com
    

브레이스 확장은 스페이스로 나뉜 문자열 목록을 얻게 되므로 이것을 for문의 in에 직접 지정할 수 있습니다. 잘 쓰면 무척 편리한 기능이므로 기억해두기 바랍니다.

1은 IP 주소 목록 작성에 브레이스 확장을 사용합니다. 여기서는 192.168.2.1에서 192.168.2.5까지 확인하므로 네 번재 옥텟에 브레이스 확장을 이용합니다. 실행 시 192.168.2.1 192.168.2.2 192.168.2.3 192.168.2.4 192.168.2.5로 변환되어서 이 IP 주소에 순서대로 ping 명령어를 실행합니다.

브레이스 확장은 여러 개 사용할 수 있으므로 예를 들어 다음처럼 192.168.0.0/16이라는 네트워크에 속한 모든 IP 주소 목록을 작성할 수 있습니다.

  • 파일1 브레이스 확장을 여러 개 쓰는 예

    #!/bin/bash
    
    for ipaddr in 192.168.{0..255}.{0..255}
    do
        echo "$ipaddr"
    done
    

이런 브레이스 확장을 이용하면 다양한 목록을 간단히 작성할 수 있습니다. IP 주소나 파일명 생성에 이용하기 바랍니다.