28_Shell 언어 ― while 와 until 순환 (while, until, sleep)

9416 단어 linuxshellwhileuntil
앞에서 소개 한 for 순환 은 사용 할 때 순환 횟수 를 결정 하기 위해 요소 목록 을 만들어 야 합 니 다. 그러나 다음 과 같은 예 를 고려 하 십시오. 사용자 가 "quit"를 입력 하면 프로그램 을 종료 합 니 다. 그렇지 않 으 면 사용자 가 입력 한 문 자 를 대문자 로 변환 합 니 다. 예 를 들 어 and 를 AND 로 전환 하고 exit 를 EXIT 로 전환 합 니 다.이 예 는 요소 목록 을 만 들 수 없습니다. 사용자 가 quit 를 언제 입력 하 는 지 확인 할 수 없고 몇 번 순환 해 야 하 는 지 확인 할 수 없습니다.이 문 제 를 해결 하려 면 새로운 메커니즘 을 도입 해 야 한다. while 와 until.while 와 until 은 특히 순환 횟수 가 알 수 없 는 상황 에 적합 하 다. 물론 순환 횟수 가 알려 진 상황 에 도 적용 된다.
1. while 의 사용 방법
while 의 기본 형식 은:
while 테스트 조건;do
문장 1
문장 2
...
done
조건 이 충족 되면 조건 이 충족 되 지 않 을 때 까지 순환 을 실행 하고 순환 을 종료 한 다 는 뜻 이다.이것 은 if 의 용법 과 약간 비슷 하 다. 단지 if 는 한 번 만 실행 할 뿐, while 는 조건 에 대해 반복 적 으로 테스트 하고 조건 이 만족 하지 않 을 때 까지 반복 적 으로 집행 한다.그렇다면 어떻게 조건 을 만족 시 키 지 못 하 게 합 니까?이 는 순환 체 에서 초기 테스트 조건 에서 해당 변수의 값 을 바 꿔 야 하 며, 바 꾸 지 않 으 면 순환 이 된다.
 
2. while 순환 의 인 스 턴 스 데모
예 1. 현재 while 순환 을 사용 하여 100 이내 의 모든 정수 와:
[root@localhost tutor]# vimsum_while.sh
#!/bin/bash
Sum=0
Count=1
while [ $Count -le 100 ]; do
       Sum=$[$Sum+$Count]
        let Count++
done
echo $Sum

 
[root@localhost tutor]# bashsum_while.sh
5050

 
예 2. 100 이내 의 모든 짝수 의 합 을 계산한다.
[root@localhost tutor]# vimeven_sum_while.sh
#!/bin/bash
EvenSum=0
Count=0
 
while [ $Count -le 100 ]; do
        letEvenSum+=Count
        let Count+=2
#   +=           
done
echo $EvenSum

 
[root@localhost tutor]# basheven_sum_while.sh
2550

 
이 프로그램 은 다음 과 같은 형식 으로 쓸 수 있다.
[root@localhost tutor]# vimeven_sum_while.sh
#!/bin/bash
EvenSum=0
Count=0
while [ $Count -le 100 ];do
        if [$[$Count%2] -eq 0 ];then
          letEvenSum+=$Count
        fi
        let Count++
done
echo $EvenSum
#                   ,        ,           ,3      

[root@localhost tutor]# basheven_sum_while.sh
2550

 
파일 의 모든 줄 을 옮 겨 다 니 려 면 while 순환 으로 입력 에 맞 춰 방향 을 바 꿀 수 있 습 니 다. done 뒤에서 읽 을 파일 을 바 꿀 수 있 습 니 다. 그 용법 은 다음 과 같 습 니 다.
 
            whileread LINE; do
              statement1
              statement2
              ...
            done 
예 3. 사용자 의 ID 번호 가 짝수 라면 이름과 셸 을 표시 합 니 다.모든 사용자 에 게 이 동작 을 수행 합 니 다:
[root@localhost tutor]# vimread_line.sh
#!/bin/bash
while read LINE; do
#    read LINE    /etc/passwd       ,        LINE     
            Uid=`echo$LINE | cut -d: -f3`
        if [ $[$Uid%2]-eq 0 ]; then
                echo$LINE | cut -d: -f1,7
        fi
done < /etc/passwd

[root@localhost tutor]# bashread_line.sh
root:/bin/bash
daemon:/sbin/nologin
lp:/sbin/nologin
shutdown:/sbin/shutdown
mail:/sbin/nologin
uucp:/sbin/nologin
games:/sbin/nologin
ftp:/sbin/nologin
rpc:/sbin/nologin
avahi-autoipd:/sbin/nologin
nfsnobody:/sbin/nologin
haldaemon:/sbin/nologin
gdm:/sbin/nologin
ntp:/sbin/nologin
apache:/sbin/nologin
saslauth:/sbin/nologin
sshd:/sbin/nologin
tcpdump:/sbin/nologin
user1:/bin/bash
user3:/bin/bash
user5:/bin/bash
user7:/bin/bash
user9:/bin/bash
hello:/bin/tcsh
hadoop:/bin/bash

 
예 4: 사용자 가 입력 한 문 자 를 대문자 로 변환 합 니 다. quit (quit 를 만 나 서 종료) 를 제외 하고:
[root@localhost tutor]# vimquit_by_user.sh
#!/bin/bash
read -p "A string: " String
while [ "$String" != 'quit' ]; do
        echo $String |tr 'a-z' 'A-Z'
        read -p"Next [quit for exit]: " String
done

[root@localhost tutor]# bashquit_by_user.sh  
A string: sd gfdg
SD GFDG
Next [quit for exit]: adf!fdsf@
ADF!FDSF@
Next [quit for exit]: exit
EXIT
Next [quit for exit]: quit
[root@localhost tutor]#

 
예 5. while 순환 통계/etc/rc. d/init. d/functions 에서\# 시작 줄 수 를 사용 합 니 다.
[root@localhost tutor]# vimnum_lines_while.sh
#!/bin/bash
Num=0
while read LINE; do
        echo $LINE |grep "^[[:space:]]*#" &> /dev/null && let Num++
#    #   ,        #    
#   &&    if
done < /etc/rc.d/init.d/functions
echo "Total $Num lines start with #."

 
[root@localhost tutor]# bashnum_lines_while.sh
Total 70 lines start with #.

 
3. until 순환 의 사용 방법
until 은 while 순환 과 유사 합 니 다. 순환 횟수 가 알 수 없 을 때 사용 합 니 다.until 의 용법 형식 은 다음 과 같다.
 
until 테스트 조건;do
 문장 1
 문장 2
 ...
done
 
while 와 반대로 until 은 조건 이 만족 할 때 순환 을 종료 합 니 다.조건 이 만족 하지 않 을 때 는 문 구 를 집행 한다.사실 until 과 while 는 서로 바 꿀 수 있 습 니 다. while 의 조건 을 만족 시 킬 때 until 입 니 다.
 
4. until 순환 의 인 스 턴 스 데모
예 6. until 을 사용 하여 예 1 을 바 꾸 고 100 이내 의 모든 정수 의 합 을 계산한다.
[root@localhost tutor]# vimsum_until.sh
#!/bin/bash
Sum=0
Count=1
until [ $Count -gt 100 ]; do
# while     le,until while     
         letSum+=$Count
         let Count++
done
echo $Sum

[root@localhost tutor]# bashsum_until.sh
5050
 
예 7. 100 이내 의 모든 짝수 의 합 과 홀수 의 합 을 계산한다.하나의 순환 에서 이 루어 진다.
[root@localhost tutor]# vimuntil_odd_even.sh
#!/bin/bash
 
SumOdd=0
SumEven=0
 
i=1
 
until [ $i -gt 100 ];do
        if [ $[$i%2]-eq 0 ];then
                letSumOdd+=$i
        else
                letSumEven+=$i
        fi
        let i++
done
 
echo " Odd Sum: $SumOdd. Even Sum: $SumEven"

 
[root@localhost tutor]# bashuntil_odd_even.sh
 Odd Sum: 2550. EvenSum: 2500

예 8. until 변경 예 4 를 사용 하여 사용자 가 입력 한 문 자 를 대문자 로 변환 합 니 다. quit (quit 종료 만 남) 를 제외 하고:
[root@localhost tutor]# vimquit_until.sh
#!/bin/bash
read -p "A String: " String
until [ "$String" == 'quit' ]; do
# while    $String   quit   ,until    
        echo $String |tr 'a-z' 'A-Z'
        read -p"Next [quit for Exit]: " String
done

[root@localhost tutor]# bashquit_until.sh
A String: sdf opq
SDF OPQ
Next [quit for Exit]: 123#fsd
123#FSD
Next [quit for Exit]: Quit
QUIT
Next [quit for Exit]: quit

 
예 9. 5 초 마다 hadop 사용자 가 로그 인 하 는 지 확인 하고 로그 인 하면 로그 인 을 표시 하고 종료 합 니 다.그렇지 않 으 면 현재 시간 을 표시 하고 hadop 이 로그 인하 지 않 았 음 을 설명 합 니 다:
 
새 명령 sleep 를 도입 해 야 합 니 다. 이 명령 은 휴면 을 표시 하고 뒤의 매개 변 수 는 초 단위 입 니 다.
 
[root@localhost tutor]# mansleep
SLEEP(1)          UserCommands            SLEEP(1)
NAME
       sleep - delayfor a specified amount of time
SYNOPSIS
       sleep NUMBER[SUFFIX]...
 
현재 로그 인 한 사용 자 를 확인 하려 면 who 명령 을 사용 할 수 있 고 hadop 사용자 가 로그 인 했 는 지 확인 하려 면 grep 명령 을 사용 할 수 있 습 니 다.
 
[root@localhost tutor]# vimhadoop_login.sh
#!/bin/bash
until who | grep "^hadoop" &> /dev/null; do
#   who             
#   who    ,        ,     []
        date
        sleep 5
done
 
echo "Welcom back, hadoop!"

상기 프로그램의 논 리 를 잘 이해 하기 위해 서 는 다음 과 같이 고 칠 수 있 습 니 다.
 
[root@localhost tutor]# vimhadoop_login.sh
#!/bin/bash
who | grep "^hadoop" &> /dev/null
RetVal=$?
#       who   grep  
#            
    until [ $RetVal-eq 0 ]; do
#           0,  who grep       ,        
        date
        sleep 5
        who | grep"^hadoop" &> /dev/null
        Retval=$?
 #   date sleep     ,      who grep  ,   hadoop      
    done
 echo "Welcomback, hadoop!"

 
[root@localhost tutor]# bashhadoop_login.sh
Sat Aug 16 09:55:37 EDT 2014
Sat Aug 16 09:55:42 EDT 2014
Sat Aug 16 09:55:47 EDT 2014
#          , Hadoop    
Welcom back, hadoop!

예 10. 스 크 립 트 쓰기:
1) 사용자 에 게 메뉴 보이 기:
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
2) 사용자 가 옵션 을 지정 하면 해당 하 는 내용 을 표시 합 니 다.
사용자 가 선택 이 완료 되면 해당 정 보 를 표시 한 후 종료 하지 않 습 니 다.사용자 가 다시 선택 하여 해당 내용 을 다시 표시 하도록 합 니 다.사용자 가 quit 를 사용 하 는 것 을 제외 하고;
 
[root@localhost tutor]# vimshow_disk.sh
#!/bin/bash
cat <<EOF
d|D) show disk usages.
m|M) show memery usages.
s|S) show swap usages.
quit) quit
EOF
 
read -p "Input your choice [quit means exit]: "Char
until [ "$Char" == 'quit' ]; do
        case $Char in
        d|D)
            df -lh
            ;;
        m|M)
            free -m |grep "^Me"
            ;;
        s|S)
            free -m |grep "^Sw"
            ;;
        *)
            echo"Input Errors."
            ;;
        esac
        read -p"Input your choice [quit means exit]:" Char
done

 
[root@localhost tutor]# bashshow_disk.sh
d|D) show disk usages.
m|M) show memery usages.
s|S) show swap usages.
quit) quit
Input your choice [quit means exit]: d
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   23G 4.6G   17G  22% /
tmpfs                        499M  112K  499M  1% /dev/shm
/dev/sda1                    485M   35M  426M  8% /boot
/dev/sdb3                    9.9G   36M  9.7G  1% /mydata
Input your choice [quit means exit]:M
Mem:          996        358        638          0         63        114
Input your choice [quit means exit]:s
Swap:        3051          0       3051
Input your choice [quit means exit]:a
Input Errors.
Input your choice [quit means exit]:quit

좋은 웹페이지 즐겨찾기