셸 프로 그래 밍 제어 문 및 예시

8749 단어
선언:
       리 눅 스 시스템 관리 과정 에서 셸 의 중요 한 도구 인 bash 를 능숙 하 게 사용 하여 프로 그래 밍 을 할 수 있 는 것 은 현재 운영 자동화 추세 에서 특히 중요 하 다.
        다른 프로 그래 밍 언어 에 비해 bash 는 자신 만 의 함수 라 이브 러 리 가 없습니다. bash 는 기능 을 수행 할 때 PATH 경 로 를 통 해 외부 명령 을 호출 합 니 다. $PATH 경로 에 포 함 된 명령 은 bash 가 실행 할 수 있 는 기능 을 결정 합 니 다. $PATH 경 로 는 bash 의 함수 라 이브 러 리 입 니 다.즉, bash 스 크 립 트 의 프로 그래 밍 은 명령 의 쌓 기 와 같 아서 bash 프로 그래 밍 은 상대 적 으로 간결 하고 이해 하기 쉬 우 며 특히 시스템 관리 업 무 를 잘 처리 합 니 다.우 리 는 bash 의 기본 적 인 특성 만 익히 면 복잡 한 임 무 를 수행 할 수 있 는 효율 적 인 스 크 립 트 를 쓸 수 있 고 운영 과정 에서 많은 문제 들 이 적은 노력 으로 큰 효 과 를 거 둘 것 이다.본 고 는 주로 셸 프로 그래 밍 제어 문 구 를 소개 하고 관련 예 시 를 추가 하여 이해 와 기억 을 깊이 있 게 한다.관련 내용 은 아래 와 같 으 니 독자 스스로 참고 하 시기 바 랍 니 다.
1. if 구문
2. case 구문
3. for 순환 및 그 특수 한 용법
4. while 순환 및 그 특수 한 용법
5, until 순환
6. 순환 제어 문 contine
7. 순환 제어 문 break
8. 순환 제어 shift 명령
9. select 순환 과 메뉴
10. 신호 캡 처 trap
1. 조건 선택: if 문장
    ① 단일 분기
        if 判断条件;then
            条件为真的分支代码
        fi

    ② 두 갈래        
        if 判断条件; then
              条件为真的分支代码
        else
              条件为假的分支代码
        fi

    ③ 여러 갈래      
         if 判断条件1; then
               条件为真的分支代码
         elif 判断条件2; then
               条件为真的分支代码
         elif 判断条件3; then
               条件为真的分支代码
         else
               以上条件都为假的分支代码
         fi

예: 사용자 입력 성적: 80 - 100 은 우수, 60 - 79 는 통과, 기타 탈락.
 #!/bin/bash
 read -p "pelease input your score: " score
 if [ "$score" -ge 80 -a "$score" -le 100 ];then
       echo "优秀"
 elif [ "$score" -lt 80 -a "$score" -ge 60 ];then
       echo "通过"
 else
       echo "淘汰"
 fi

2. 조건 판단: case 문장
 语法:case 变量引用 in
    PAT1)
         分支1;;
    PAT2)
        分支2;;
    ...
      *)
       默认分支;;
        esac

       case 는 glob 스타일 의 마스크 를 지원 합 니 다:              *: 임의의 길이 임 의 문자              ?: 임의의 단일 문자              []: 지정 한 범위 내의 임의의 단일 문자              a | b: a 또는 b
              ...
      예제: 스 크 립 트 를 작성 하여 yes 나 no 를 입력 할 때 대소 문 자 를 구분 하지 않 고 yes 또는 no 또는 다른 정 보 를 입력 하 는 지 판단 합 니 다.
#!/bin/bash
read -p "please input yes or no: " yn
ans=$(echo $yn|tr "[[:upper:]]"  "[[:lower:]]")
case $ans in
y|yes)
   echo yes;;
n|no)
   echo no ;;
*)
  echo yes/no?
esac

3. for 순환
     문법: for 변수 이름 in 목록 ; do                    순환 체                done
     실행 메커니즘: 목록 에 있 는 요 소 를 '변수 이름' 에 순서대로 할당 합 니 다.매번 값 을 부여 한 후 순환 체 를 실행 합 니 다.목록 에 있 는 요소 가 다 소 진 될 때 까지 순환 이 끝 납 니 다.
     목록 생 성 방법:      (1) 목록 바로 보 여주 기      (2) 정수 목록:            (a) {start..end}            (b) $(seq [start [step]] end)      (3) 목록 을 되 돌려 주 는 명령            $(COMMAND)      (4) glob 사용, 예: *. sh      (5) 변수 참조;            $@, $*
    예제: for 순환 으로 99 곱셈 표를 인쇄 합 니 다.
#!/bin/bash
for i in {1..9};do
    for j in $(seq $i);do
       echo -ne "$j*$i=$[$i*$j]\t"
    done
    echo
done

       for 순환 의 특수 형식:     
          for (제어 변수 초기 화 ; 조건 부 판단 식 ; 변 수 를 제어 하 는 수정 식)          do                    순환 체          done
  • 제어 변수 초기 화: 순환 코드 세그먼트 까지 만 실행
  • 제어 변수의 수정 표현 식: 매 라운드 순환 이 끝 날 때마다 제어 변수 수정 연산 을 한 다음 에 조건 판단 예 시 를 한다. for 순환 특수 형식 으로 99 곱셈 표를 인쇄 한다.
  • #!/bin/bash
    for ((i=1;i<=9;i++)); do
    
        for ((j=1;j<=i;j++)); do
           echo -ne "$j*$i=$[$j*$i]\t"
        done
        echo
    done

    4. while 순환
        문법: while CONDITION;do                        순환 체               done
         CONDITION: 순환 제어 조건;순환 에 들 어가 기 전에 먼저 판단 을 한다.매번 순환 한 후에 다시 판단 한다.조건 이 "true"이면 순환 을 실행 합 니 다.조건 부 테스트 상태 가 "false"로 끝 날 때 까지 순환     따라서: CONDTION 은 일반적으로 순환 제어 변수 가 있어 야 합 니 다.이 변수의 값 은 순환 체 에서 끊임없이 수 정 됩 니 다.     입장 조건: CONDITION 은 true     종료 조건: CONDITION 은 false
    예: 100 이내 에 3 으로 나 눌 수 있 는 수의 합 을 구하 다.
    #!/bin/bash
    declare i=1
    declare sum=0
    while [  "$i" -lt 100 ];do
          let i++ 
          if [ $[i%3] -ne 0 ];then
             continue
          fi  
          let sum+=$i
    done
    echo sum is $sum

          while 의 특수 한 용법 (파일 의 줄 마다 옮 겨 다 니 기):
           while read line; do                순환 체       done        예제: ID 번호 가 짝수 인 모든 사용 자 를 찾 아 사용자 이름과 ID 번 호 를 표시 합 니 다.
    while read line ;do
         if [ $[`echo $line|cut -d: -f3`%2] -eq 0 ];then
                    echo -ne "username:`echo $line|cut -d: -f1` \t"
                    echo "uid:`echo $line|cut -d: -f3`"
         fi  
    done 
        

           或者将内容通过管道传给while循环:

           示例:若磁盘利用率大于80%,则通知用户。

    #!/bin/bash
    df|grep "/dev/sd"|while read disk ;do
          diskused=$(echo $disk|sed -r 's/.* ([0-9]+)%.*/\1/')
          diskname=$(echo $disk|cut -d" " -f1)
          [ $diskused -ge 80 ] && echo "$diskname will bi full: $diskused%"
    done

    5. untill 순환
         문법 until CONDITION;do                    순환 체
               done           입장 조건: CONDITION 은 false           종료 조건: CONDITION 은 true
    예제: until 로 99 곱셈 표를 인쇄 합 니 다.
    #!/bin/bash
    j=1
    i=1
    until [ "$j" -gt 9 ];do
         until [ "$i" -gt "$j" ];do
            echo -ne "$i*$j=$[i*j]\t"
            let i++
         done
         echo
         let i=1
         let j++
    done

    6. 순환 제어 문 contine
          contine 순환 체 에 사용      contine [N]: N 층 의 이번 순환 을 미리 끝내 고 다음 라운드 판단 에 들 어 갑 니 다.최 내층 은 제 1 층 이다      while CONDTIITON1; do              CMD1              ...      if CONDITION2; then      continue      fi      CMDn       ...      done
    예제: 5 를 제외 한 1 - 10 사이 의 숫자 를 인쇄 합 니 다.
    #!/bin/bash
    for i in {1..10};do
        if [ $i -eq 5 ];then
            continue
        else
            echo $i
        fi                                                                                                                                                 
    done

    7. 순환 제어 문 break
          문법:
          break [N]:, 最内层为第1层
          while CONDTIITON1; do
                   CMD1
                   ...
              if CONDITION2; then
                   break
              fi
              CMDn
              ...
          done

          break 와 contine 의 차 이 는 contine 은 순환 에서 조건 을 만족 시 키 는 단일 순환 을 뛰 어 넘 고 break 는 자신 이 있 는 순환 체 를 기본적으로 뛰 어 넘 는 것 이다.contine 예제 에서 break 로 바 뀌 면 1 - 4 만 인쇄 합 니 다. 5 트리거 break 가 순환 한 후에 인쇄 되 지 않 기 때 문 입 니 다.
    8. 순환 제어 shift 명령
          shift [n]      n. 파 라 메 트릭 목록 list 를 왼쪽 으로 이동 하 는 데 사용 합 니 다.      파 라 메 트릭 목록 list 가 이동 하면 맨 왼쪽 에 있 는 매개 변 수 는 목록 에서 삭 제 됩 니 다.while 위치 파 라 메 트릭 목록 을 반복 할 때 shift 에 자주 사 용 됩 니 다.      예시
    #!/bin/bash
    while (($#>0));do
       echo $*
       shift
    done 
    显示结果:
    [root@R1 app]# ./haha.sh a b c d e
    a b c d e
    b c d e
    c d e
    d e
    e

    9. select 순환 과 메뉴
    select variable in list
    do
    循环体命令
    done
  • selection 순환 은 주로 메뉴 를 만 드 는 데 사 용 됩 니 다. 숫자 순 으로 배 열 된 메뉴 항목 은 표준 오류 에 표시 되 고 PS3 프롬프트 를 표시 하여 사용자 의 입력 을 기다 리 고 있 습 니 다.
  • 사용 자 는 메뉴 목록 의 어떤 숫자 를 입력 하고 해당 하 는 명령 을 수행 합 니 다.
  • 사용자 입력 이 내 장 된 변수 REPLY 에 저 장 됨
  • select 는 무한 순환 이 므 로 break 명령 으로 순환 을 종료 하거나 exit 명령 으로 스 크 립 트 를 종료 하 는 것 을 기억 해 야 합 니 다.ctrl + c 를 누 르 면 순환 을 종료 할 수 있 습 니 다.
  • select 는 자주 케이스 와 공동으로 사용한다
  • for 순환 과 유사 하여 in list 를 생략 할 수 있 습 니 다. 이때 사용 위치 파 라 메 트릭 예제:
  • #!/bin/bash
    PS3="please choose your menu: "
    select menu in huimian lamian hulatang yrt;do
          case $REPLY in                                                                                                                                   
          1)
              echo "the price is \$10"   ;;
          2)
              echo "the price is \$15"   ;;
          3)
              echo "the price is \$5"    ;;
          4)
              echo "the price is \$20"   ;;
          *)
              echo "get out!"
              break
          esac
    done

    10. 신호 캡 처 trap
           trap '트리거 명령' 신호            사용자 정의 프로 세 스 가 시스템 에서 보 낸 지정 신 호 를 받 으 면 원본 작업 대신 트리거 명령 을 실행 합 니 다.        trap 신호            신호 조작 무시        trap '-' 신호            원 신호 복구 작업        trap -p            사용자 정의 신호 조작 목록
    예시:
    #!/bin/bash
     trap 'echo “signal:SIGINT"' int
     trap -p
     for((i=0;i<=10;i++))
     do
     sleep 1
     echo $i
     done
     trap '' int
     trap -p
     for((i=11;i<=20;i++))
     do
     sleep 1
     echo $i
     done
     trap '-' int
     trap -p
     for((i=21;i<=30;i++))
     do
     sleep 1
     echo $i
     done

    다음으로 전송:https://blog.51cto.com/arm2012/1959519

    좋은 웹페이지 즐겨찾기