Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

루프 유지 – Bash For, While, When 루프의 예

루프 유지 – Bash For, While, When 루프의 예루핑 명령문은 프로그램이 명령문을 반복적으로 실행하도록 하는 데 사용됩니다. 실행된 문을 루프 본문이라고 합니다.

루프는 제어 표현식의 값이 0이 될 때까지 실행됩니다. 제어 표현식은 모든 스칼라 데이터 유형이 될 수 있습니다.

쉘 언어는 또한 여러 반복문 또는 반복문을 제공합니다. 이 기사에서는 몇 가지 예를 사용하여 bash가 제공하는 반복문을 검토해 보겠습니다.

Bash는 다음 세 가지 유형의 반복문을 지원합니다.

  1. For 루프
  2. while 루프
  3. 루프까지

이 기사는 진행 중인 Bash Tutorial 시리즈의 일부입니다.

루프는 중첩될 수 있습니다. 다른 프로그래밍 언어와 마찬가지로 bash는 현재 루프를 종료하기 위해 break 문을 지원하고 루프 문의 다음 반복을 재개하기 위해 계속 문을 지원합니다.

Bash For 루프 – 첫 번째 방법

For 루프는 일반적으로 bash 루프에 들어가기 전에 반복 횟수를 알고 있을 때 사용됩니다. Bash는 두 종류의 for 루프를 지원합니다. bash for 루프의 첫 번째 형식은 다음과 같습니다.

for varname in list
 do
 commands ##Body of the loop
 done

위 구문에서:

<센터>
  • for, in, do 및 done 키워드
  • 목록은 항목 목록이 있는 목록입니다.
  • varname은 모든 Bash 변수 이름입니다.

이 형식에서 for 문은 목록의 각 항목에 대해 한 번씩 본문에 포함된 명령을 실행합니다. 목록의 현재 항목은 루프를 통해 매번 변수 "varname"에 저장됩니다. 이 변수 이름은 루프 본문에서 처리할 수 있습니다. 이 목록은 공백으로 구분된 여러 단어를 포함하는 변수일 수 있습니다. for 문에 목록이 없으면 쉘에 전달된 위치 매개변수를 사용합니다.

Bash For Loop 예제 1. 모든 Zip 파일 압축 해제

다음 예는 루트 디렉토리에서 "*.zip*"과 일치하는 파일 목록을 찾아 zip 파일이 있는 동일한 위치에 새 디렉토리를 생성하고 zip 파일 내용의 압축을 풉니다.

# cat zip_unzip.sh
#! /bin/bash
# Find files which has .zip
for file in `find /root -name "*.zip*" -type f`
do

# Skip the extension .zip
dirname=`echo ${file} | awk -F'.' '{print $1}'`

# Create the directory
mkdir $dirname

# Copy the zip file
cp ${file} ${dirname}
cd $dirname

# Unzip the zip file from newly created directory
unzip ${dirname}/$(echo ${file##/*/})
done
  • 이 예에서 find 명령은 루프를 통해 각 파일이 처리될 파일 목록을 반환합니다.
  • 각 항목에 대해 zip 파일 이름으로 디렉토리를 생성하고, 새로 생성된 디렉토리에 zip 파일을 복사하고 거기에서 zip 파일의 압축을 풉니다.
  • echo 문 echo ${file##/*/}는 경로가 아닌 파일 이름만 제공합니다.
# ./zip_unzip.sh
Archive: /root/test2/test2.zip
 extracting: t1/p
 extracting: t1/q
 extracting: t1/r
 extracting: t1/s
 extracting: t1/t
 extracting: t1/u
 extracting: t1/v
Archive: /root/test1/test1.zip
 extracting: t/a
 extracting: t/b
 extracting: t/c
 extracting: t/d
 extracting: t/e

Bash 루프와 유사하게 Awk는 Awk While 및 For 루프 기사에서 논의한 대로 for 루프와 while 루프도 제공합니다.

Bash For 루프 – 두 번째 방법

for 루프의 두 번째 형태는 3가지 표현식(초기화, 조건 및 업데이트)이 있는 'C' 프로그래밍 언어의 for 루프와 유사합니다.

for (( expr1; expr2; expr3 ))
 do
 commands
 done
  • 위의 bash for 명령 구문에서 첫 번째 반복 전에 expr1이 평가됩니다. 이것은 일반적으로 루프의 변수를 초기화하는 데 사용됩니다.
  • do와 done 사이의 모든 문장은 expr2의 값이 TRUE가 될 때까지 반복적으로 실행됩니다.
  • 루프를 반복할 때마다 expr3이 평가됩니다. 이것은 일반적으로 루프 카운터를 증가시키는 데 사용됩니다.

다음 예에서는 n개의 난수를 생성합니다.

Bash 예 2. n개의 난수 생성

$ cat random.sh
#! /bin/bash

echo -e "How many random numbers you want to generate"
read max

for (( start = 1; start <= $max; start++ ))
do
 echo -e $RANDOM
done

$ ./random.sh
How many random numbers you want to generate
5
6119
27200
1998
12097
9181

위의 코드 조각에서 for 루프는 최대 횟수로 난수를 생성합니다. RANDOM은 호출할 때마다 임의의 정수를 반환하는 내부 bash 함수입니다.

Bash While 루프

쉘 프로그래밍 언어가 제공하는 또 다른 반복문은 while 문입니다.

Syntax:
while expression
do
 commands
done

위의 while 루프 구문에서:

  • while, do, done 키워드
  • 표현식은 스칼라 값을 반환하는 표현식입니다.
  • While 문은 제공된 조건식이 참인 동안 코드 블록을 실행합니다.

Bash While 예제 3. 파일에 내용 쓰기

다음 예는 stdout에서 데이터를 읽고 파일에 씁니다.

$ cat writefile.sh
#! /bin/bash

echo -e "Enter absolute path of the file name you want to create"
read file
while read line
do
echo $line >> $file
done

$ sh writefile.sh
Enter absolute path of the file name you want to create
/tmp/a
while
for
until

$ cat /tmp/a
while
for
until

위의 예는 사용자로부터 파일 이름을 읽고 stdin에서 데이터 줄을 읽고 각 줄을 지정된 파일 이름에 추가합니다. EOF가 입력되면 읽기가 실패하므로 루프가 여기서 종료됩니다.

많은 bash 스크립트를 작성하는 경우 앞에서 설명한 것처럼 Vim bash 지원 플러그인을 사용하여 Vim 편집기를 Bash IDE로 사용할 수 있습니다.

Bash While 예제 4. 파일 내용 읽기

이전 예에서는 stdout에서 데이터를 읽고 파일에 씁니다. 이 예에서는 파일 내용을 읽고
표준 출력에 씁니다.

$ cat read.sh
#! /bin/bash
echo -e "Enter absolute path of the file name you want to read"
read file
exec <$file # redirects stdin to a file
while read line
do
echo $line
done

$ ./read.sh

Enter absolute path of the file name you want to read
/tmp/a
while
for
until

이 예에서는 읽을 파일 이름을 가져오고 exec를 사용하여 stdin을 파일로 리디렉션합니다. 그 시점부터 모든 stdin은 키보드가 아닌 해당 파일에서 가져옵니다. read 명령은 표준 입력에서 행을 읽으므로 루프는 EOF가 발생할 때까지 표준 입력을 읽습니다.

루프까지 배쉬

when 문은 구문 및 기능면에서 while 문과 매우 유사합니다. 둘 사이의 유일한 실제 차이점은 조건식이 false인 동안 until 문은 코드 블록을 실행하고 조건식이 true일 때 while 문은 코드 블록을 실행한다는 것입니다.

syntax:

until expression
 do
 commands #body of the loop
 done

위의 bash until 구문에서:
여기서 until, do, done은 키워드입니다.
expression any conditional expression

예제 5까지 Bash. 로그 파일 모니터링

이 예제는 로그 파일의 크기를 모니터링하며, 로그 파일 크기가 2000바이트에 도달하면 해당 로그 파일의 복사본을 가져옵니다.

$ cat monitor.sh

file=/tmp/logfile
until [ $(ls -l $file | awk '{print $5}') -gt 2000 ]
 do
 echo "Sleeping for next 5 seconds"
 sleep 5
 done
date=`date +%s`
cp $file "$file-"$date.bak

$ ./monitor.sh
Sleeping for next 5 seconds
Sleeping for next 5 seconds

$ ls -l /tmp/logfile*
-rw-r--r-- 1 sss sss 2010 Jun 24 12:29 logfile
-rw-r--r-- 1 sss sss 2005 Jun 24 16:09 logfile-1277474574.bak

when 문은 조건이 참이 될 때까지 루프의 본문을 계속 실행합니다. 이 예제에서 조건은 2000바이트보다 큰 파일 크기이므로 2000바이트에 도달하면 파일을 복사합니다.

또한 이전 Bash Array 예제를 참조하십시오.

예제 6까지 Bash. 머신이 올 때까지 기다리기

이 예는 해당 머신에 ssh를 수행하기 전에 머신이 올 때까지 기다리는 데 사용됩니다. ping이 응답할 때만 루프 문은 종료됩니다.

$ cat mac_wait.sh
#! /bin/bash

read -p "Enter IP Address:" ipadd
echo $ipadd
until ping -c 1 $ipadd
do
 sleep 60;
done
ssh $ipadd

$./mac_wait.sh
Enter IP Address:192.143.2.10
PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data.

--- 192.143.2.10 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data.
64 bytes from 192.143.2.10: icmp_seq=1 ttl=64 time=0.059 ms

--- 192.143.2.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms
The authenticity of host '192.143.2.10 (192.143.2.10)' can't be established.
Are you sure you want to continue connecting (yes/no)? yes

until 루프는 특정 이벤트가 발생하기를 기다리는 방법으로 명령줄에서 매우 유용합니다.