셸 스 크 립 트 프로 그래 밍 학습 의 길 - while 순환

7055 단어 linuxshell
1. 타 입 순환 과 타 입 순환
while 순환 에 사용 되 는 것 이 많 지 않 습 니 다. 일반 데 몬 프로그램 이나 항상 순환 실행 에 사용 되 며, 다른 순환 연산 은 모두 for 순환 으로 대 체 됩 니 다.
1.1 당 형 과 유형 순환 문법
(1) while 조건문
while  

do

        ….

done

while 순환 실행 프로 세 스에 대응 하 는 논리 도 그림 1 - 1 참조:
(2) until 조건문
until  

do

        …

Done

알림: 한 번 만 순환 하고 응용 장면 이 많 지 않 으 니 알 면 됩 니 다.
1.2 당 형 과 유형 순환 까지 의 기본 범례
실행 종료 시간: sleep 1 종료 초, usleep 1000000 종료 1 초.1 분 에 한 번 스 크 립 트 를 실행 하면 정시 작업 을 사용 합 니 다.
1.2.1 범례 1: 2 초 마다 시스템 부하 상황 을 기록 합 니 다.
방법 1: 2 초 간격 으로 화면 출력 부하 값
[root@shellbiancheng jiaobenlianxi]# cat while1.sh 
#!/bin/sh
while true
   do
    uptime
    sleep 2
   done

알림: while true 는 조건 이 영원히 진실 임 을 표시 하기 때문에 계속 실 행 됩 니 다. 죽은 순환 처럼 데 몬 이 라 고 합 니 다.
실행 결 과 는 다음 과 같 습 니 다.
[root@shellbiancheng jiaobenlianxi]# sh while1.sh 
 02:50:13 up 1 day, 11:47,  3 users,  load average: 0.00, 0.00, 0.00
 02:50:15 up 1 day, 11:47,  3 users,  load average: 0.00, 0.00, 0.00

방법 2: log 로그 파일 에 추가
[root@shellbiancheng jiaobenlianxi]# cat while2.sh 
#!/bin/sh
while [ 1 ]    []        ,true 1         
   do
    uptime >>./uptime.log
    sleep 2
   done
[root@shellbiancheng jiaobenlianxi]# tail -f uptime.log 
 03:00:24 up 1 day, 11:57,  3 users,  load average: 0.01, 0.01, 0.00
 03:00:26 up 1 day, 11:57,  3 users,  load average: 0.01, 0.01, 0.00

스 크 립 트 의 끝 에 & 기 호 를 사용 하여 배경 에서 스 크 립 트 를 실행 합 니 다:
[root@shellbiancheng jiaobenlianxi]# sh while2.sh &

[1] 3991

알림: 배경 에서 영구적 으로 실 행 됩 니 다. 데 몬 모드 라 고 합 니 다.
클 라 이언 트 가 스 크 립 트 를 실행 하 는 것 을 방지 하고 배경 에서 영구적 으로 실행 하 는 방법:
(1) sh while 2. sh & 기호 추가, 스 크 립 트 배경 에서 실행
(2) nohup while 2. sh & 사용자 가 종료 한 후에 스 크 립 트 를 계속 실행 합 니 다.
(3) 화면 유지 세 션
1.2.2 스 크 립 트 가 배경 에서 지식 을 실행 하도록 합 니 다.
확장:
bg: 백그라운드 실행
fg: 프로그램 종료
jobs: 배경 프로그램 보이 기
kill (kill% 1), killall, pkill: 프로 세 스 죽 이기
crontab: 설정 시간
ps: 프로 세 스 보기
pstree: 프로 세 스 보이 기
nice: 우선 순위 변경
nohup: 사용자 가 시스템 을 종료 한 후에 계속 작업 합 니 다.
pgrep: 일치 하 는 조건 을 찾 는 프로 세 스
strace: 프로 세 스 의 시스템 호출 상황 을 추적 합 니 다. 작업 중 어떤 프로 세 스 의 사용률 이 너무 높 으 면 strace 로 프로 세 스 시스템 호출 상황 을 볼 수 있 습 니 다.
ltrace: 프로 세 스 가 라 이브 러 리 함 수 를 호출 하 는 상황 을 추적 합 니 다.
vmstat: 가상 메모리 통계 정 보 를 보고 합 니 다.
1.3 간단 한 범례
1.3.1 범례 1: while 문 구 를 통 해 1 에서 100 까지 의 합 을 계산 하고 누적 하 는 방법 을 사용 하 십시오.
[root@shellbiancheng jiaobenlianxi]# cat 1-100.sh 
#!/bin/sh
sum=0
i=1
while [ $i -le 100 ]
do
 ((sum=sum+i))
 ((i++))
done
echo $sum

1.3.2 범례 2: 수학 공식 을 통 해 계산 한 결과
[root@shellbiancheng jiaobenlianxi]# cat sum1-100.sh 
#!/bin/sh
i=100
((sum=i*(i+1)/2))
echo $sum

1.3.3 범례 3: 핸드폰 충전
핸드폰 충전 10 위안, 문자 메시지 (현재 잔액 출력) 를 보 낼 때마다 1 각 5 전 을 소비 합 니 다. 잔액 이 1 각 5 전 보다 적 으 면 문 자 를 보 낼 수 없고 잔액 이 부족 하 다 는 것 을 알 립 니 다. 충전 하 십시오 (사용자 가 계속 충전 하여 문 자 를 계속 보 낼 수 있 습 니 다). while 문 구 를 사용 하여 실현 하 십시오.
알림: 단위 환산, 단위 통일, 정수 로 통일.10 원 = 1000 점, 1 각 5 점 = 15 점
[root@shellbiancheng jiaobenlianxi]# cat huafei.sh 
#!/bin/bash
HUAFEI=100
YUE=25
if [ -f /etc/init.d/functions  ];then
    . /etc/init.d/functions
fi
OPTION() {
case "$option" in
    [yY]|[yY][eE][sS])
        echo "Send a success"
        echo $txt >>/var/log/consum.log
        ((HUAFEI=HUAFEI-YUE))
        echo "You're still saving money $HUAFEI"
        ;;
    [nN]|[nN][oO])
        echo "Abort send, succeed."
        ;;
        *)
        echo "Input error"
        ;;
esac
    return 0
}

CHANGE1() {
    expr $change + 1 &>/dev/null
    if [ "$?" -ne "0" -a "$change" != "-1" ];then
        echo "There are illegal characters, please reenter the amount of recharge."
    else
    break
    fi
    return 0
}

CHANGE() {
while true
do
read -p "Please input the amount you want to recharge:" change
CHANGE1
done
return 0
}

CHANGE2() {

((HUAFEI+=change))
echo "You're still saving money $HUAFEI"

}

OPTION2() {
case "$option2" in
    [yY]|[yY][eE][sS])
        CHANGE
        CHANGE2
        ;;
    [nN]|[nN][oO])
        exit 1
        ;;
        *)
        echo "Input error, please enter the correct amount."
         CHANGE
         CHANGE2
        ;;
esac
return 0
}

linzhongniao() {

if [ "$HUAFEI" -lt "$YUE" ];then
    read -p "The balance is insufficient, please recharge[y|n]" option2
    OPTION2
fi
return 0
}

main() {
while [ "$HUAFEI" -ge "$YUE" ]
do
read -p "Please enter the content of the text message:" txt
read -p "Confirm send [y|n]" option

OPTION
linzhongniao
done
return 0
}
main

1.4 확장
while 줄 별로 파일 읽 는 방식
1.4.1 방법 1: exec 로 파일 읽 기
[root@shellbiancheng jiaobenlianxi]# cat while_duwenjian1.sh 
#!/bin/bash
i=/home/linzhongniao/tools/access.log
exec

1.4.2 방법 2: cat 로 파일 읽 기
[root@shellbiancheng jiaobenlianxi]# cat while_duwenjian2.sh 
#!/bin/bash
i=/home/linzhongniao/tools/access.log 
cat $i|while read line
do
echo $line
done

1.4.3 방법 3: while 순환 끝 에 파일 을 다시 지정 합 니 다.
[root@shellbiancheng jiaobenlianxi]# cat while_duwenjian3.sh 
#!/bin/bash
i=/home/linzhongniao/tools/access.log
 while read line
 do
echo $line
 done

1.4.4 문제 분석 apache 로그 예
apache 접근 로 그 를 분석 하고 로그 의 각 줄 의 방문 바이트 수 에 대응 하 는 필드 수 를 추가 하여 방문 문 량 을 계산 합 니 다.while 순환 으로 이 루어 집 니 다.친구 들 이 테스트 를 할 때 방문 로그 가 없 으 면 인터넷 에서 방문 로 그 를 다운로드 할 수 있 습 니 다.
[root@shellbiancheng tools]# wc -l access_2013_05_30.log 
548160 access_2013_05_30.log    
[root@shellbiancheng jiaobenlianxi]# cat apachefangwen.sh
#!/bin/bash
sum=0
RETVAL=0
byte="1024"
b="/home/linzhongniao/tools/access_2013_05_30.log"
exec /dev/null
   if [ $? -ne 0 ];then
   ((sum+=size))    
   fi
done
echo "${b}:total:${sum}bytes = `expr ${sum} / $byte`KB"

계산 하 는 곳 에 문제 가 생 겼 습 니 다. 수정 하기 전에 계산 하 는 곳 은 이렇게 쓰 여 있 습 니 다 (sum + = $size). 작은 파일 을 처리 할 때 큰 파일 을 처리 할 때 오류 가 발생 합 니 다 (제 테스트 텍스트 는 54 만 줄 입 니 다). 인터넷 에서 조회 한 이 유 는 $값 을 받 을 때 괄호 안에 변수 만 있 으 면 됩 니 다 (변 수 는 스스로 계산 할 수 있 습 니 다).괄호 안에서 연산 할 필요 가 없 는 변 수 는 값 을 추출 하 는 작업 을 하고 있 습 니 다. 즉, 괄호 안의 $기 호 를 제거 하 는 것 입 니 다. 아, 이 작은 문제 가 나 를 반나절 동안 괴 롭 혔 군요.
2. While 순환 소결
1. while 순환 의 특 기 는 데 몬 을 실행 하고 우리 가 순환 을 종료 하지 않 고 지속 적 으로 실행 하 기 를 원 하 는 경우 입 니 다. 주파수 가 1 분 이하 로 순환 처리 되 고 다른 while 순환 은 거의 for 순환 으로 대 체 될 수 있 습 니 다.
2. case 문 구 는 if 문 구 를 교체 할 수 있 습 니 다. 일반적으로 시스템 시작 스 크 립 트 에 소량의 고정 규칙 문자열 을 입력 하고 case 문 구 를 사용 합 니 다.기타 일반적인 판단 은 if 문 구 를 많이 사용한다.
3. if 와 for 문 구 는 while (데 몬), case (서비스 시작 스 크 립 트) 가 가장 많이 사용 된다.
각 문장의 응용 장면:
조건 식, 간단 한 판단 (파일 이 존재 하 는 지, 문자열 이 비어 있 는 지 등).
if 수치 판단, 수치 가 적은 경우.
for 순환 정상 적 인 순환 처리, 가장 자주 사용!
while 순환 데 몬, 무한 순환 (sleep).
case 서비스 시작 스 크 립 트, 메뉴.
함수 논리 가 뚜렷 하여 중복 문 구 를 줄인다.

좋은 웹페이지 즐겨찾기