bash_09 정수값으로 난수 얻기

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

명령어: nc, echo, sleep
키워드: 난수, 정수
사용처: 외부 명령어를 사용하지 않고 셸 스크립트만으로 난수를 얻고 싶을 때


실행예제

$ ./bash-random.sh
Connection to 192.168.2.1 80 port [tcp/http] succeeded!
Wait: 4 sec.
Connection to 192.168.2.1 80 port [tcp/http] succeeded!

스크립트

#!/bin/bash

# 접속 정보 정의
ipaddr="192.168.2.1"  #-------------------------- 1
port=80  #--------------------------------------- 1

# 1에서 10까지의 정수값 난수를 RANDOM 변수에서 얻기
waittime=$((RANDOM % 10 + 1))  #----------------- 2

# 테스트 명령어를 sleep하며 2회 실행
nc -w 5 -zv $ipaddr $port  #--------------------- 3
echo "Wait: $waittime sec."  #------------------- 3
sleep $waittime  #------------------------------- 3
nc -w 5 -zv $ipaddr $port  #--------------------- 3

   

해설

이 스크립트는 nc 명령어로 네트워크 통신 확인을 2회 실행하는데 중간에 난수로 만든 초만큼 기다립니다. 난수는 bash 셸 변수 RANDOM을 이용합니다. 이 스크립트는 난수를 얻는 부분에 bash 기능을 사용하는 것 외에는 쉘기능을 자유자재로 다루기_12 셸 스크립트 일부에 Perl이나 Ruby 사용하기 에서의 예제와 동일하므로 스크립트 동작은 해당 항목을 참조하기 바랍니다.

셸 스크립트를 작성하다보면 테스트를 위한 대기 시간이나 게임에서 쓰는 주사위 같은 곳에서 난수가 필요합니다. 하지만 sh 자체에는 난수를 생성하는 기능이 없으므로 /dev/urandom 등을 써서 난수를 조합해야 합니다. 하지만 bahs는 난수를 생성하는 기본 기능이 있습니다. 그것이 셸 변수 RANDOM입니다.

bash 셸 변수 RANDOM은 참조할 때마다 0에서 32767 사이의 정수값 난수를 돌려줍니다. 이것을 이용해서 1에서 n 사이 난수를 얻고 싶으면 다음처럼 산술 확장을 이용합니다. bash 산술 확장은 bash_03 사칙 연산을 간단하게 작성하기을 참조하기 바랍니다.

$((RANDOM % n + 1))

이것은 산술식의 나머지를 의미하는 연산자 %를 이용합니다. 예를 들어 n이 10이면 나머지는 0에서 9까지이므로 거기에 1을 더하면 1에서 10 사이 난수를 얻을 수 있습니다. 이것은 자주 사용하는 방법이므로 통째로 외워두기 바랍니다.

1은 우선 통신 확인을 할 대상 호스트 IP 주소와 포트 번호를 지정합니다.

이어서 2는 확인 간격의 대기 시간(초)을 난수로 취득합니다. 여기서 대기 시간은 1에서 10의 난수를 얻기 위해 RANDOM 변수의 10의 나머지에 1을 더합니다. 얻은 난수를 셸 변수 waittime에 대입합니다.

3은 nc 명령어로 통신 확인을 두 번하고 중간에 앞서 2에서 취득한 난수(초)만틈 대기 합니다. 여기서 nc 명령어 옵션은 네트워크_06 서버의 특정 포트가 열려 있는지 확인하는 스크립트 작성하기을 참조하기 바랍니다.

이렇게 해서 bash에서 간단히 난수값을 얻을 수 있습니다. 기억해두면 도움이 될 것입니다.

   

주의사항