- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: 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 주소나 파일명 생성에 이용하기 바랍니다.