셸 프로 그래 밍 학습 노트 [오리지널]

24604 단어
본 고 는 본인 을 위해 필 기 를 하고 있 습 니 다. 전재 가 있 으 면 출처 를 밝 혀 주 십시오. 감사합니다.
1. Bourne Shell 은 다음 과 같은 네 가지 변수 가 있 습 니 다.
  • 사용자 정의 변수
  • 위치 변수, 즉 명령 행 인자
  • 미리 정 의 된 변수
  • 환경 변수
  •  
    위치 변수
    $0 与键入的命令行一样,包含脚本文件名
    
    $1, $2, ……. $9  分别包含第一个到第九个命令行参数
    
    $#  包含命令行参数的个数
    
    $@ 包含所有命令行参数: “$1, $2, ……. $9”会一个一个拆分解析
    
    $?  包含前一个命令的退出状态
    
    $*  包含所有命令行参数: “$1, $2, ……. $9”所有包括在一起解析的
    
    $$  包含正在执行进程的ID号

     
     
    환경 변수
    ts.sh
    #!/bin/sh
    echo  “PATH=$PATH”
     
    ./ts.sh
     
    HOME :  /etc/passwd 파일 에 열 거 된 사용자 홈 디 렉 터 리
    IFS:   Internal Field  Separator, 기본 값 은 빈 칸, tab 및 줄 바 꿈 문자 입 니 다.
    PATH: 셸 검색 경로
    PS1, PS2:  기본 프롬프트 ($) 및 줄 바 꾸 기 프롬프트 (>)
    TERM:  터미널 유형, vt 100, ansi, vt 200, xterm 등 자주 사용 합 니 다.
     
    4. read 용법
    read 는 표준 입력 에서 한 줄 을 읽 고 뒤의 변 수 를 할당 합 니 다. 문법 은 다음 과 같 습 니 다.
    read var
    읽 은 데 이 터 를 모두 var 에 할당 합 니 다.
     
    read  var1  var2  var3
    읽 기 줄 에 있 는 첫 번 째 단어 (word) 를 var 1 에, 두 번 째 단 어 를 var 2 에, 나머지 모든 단 어 를 마지막 변수 에 부여 합 니 다.
    read 문 구 를 실행 할 때 표준 입력 이 데이터 가 없 으 면 프로그램 은 여기 서 머 물 러 서 데이터 가 오 거나 종 료 된 것 을 알 고 있 습 니 다.
     
    #!/bin/sh
     
     read val val2 val3                                                                                          
     echo "val=$val"
     echo "val2=$val2"
     echo "val3=$val3"
     
     
    5. 셸 프로 그래 밍 코드 분석
    #!/bin/sh
    
    #位置变量
    #$0 与键入的命令行一样,包含脚本文件名
    #$1, $2, ……. $9  分别包含第一个到第九个命令行参数
    #$#  包含命令行参数的个数
    #$@ 包含所有命令行参数: “$1, $2, ……. $9”会一个一个拆分解析
    #$?  包含前一个命令的退出状态
    #$*  包含所有命令行参数: “$1, $2, ……. $9”所有包括在一起解析的
    #$$  包含正在执行进程的ID号
     
    #1. shell头文件
             echo "hello world"
     
    
    #2. 用户自定义变量
             echo "please input your num:"
    
    #接收用户输入信息
    #       read num
    #       echo "num = $num"
     
    
    #3. 预定义变量
             num=123
             echo "num = $num"
    
    #4. 位置变量
            echo "*********<>*********************"
             #     $0     $1  $2 $3 $4
             # ./ts1.sh    1  2  3  4
             echo "argv[0]=$0"
    #       echo "argv[1]=$1"
             echo "argv[2]=$2"
    #       echo "argv[3]=$3"
    #       echo "argv[4]=$4"
             echo "argc  =$#"
            
    
             ls ./
             echo "exit = $?"   # 正常退出=0
    
             ls ./xxx
             echo "exit = $?"   # 异常退出>0       
             echo "*************<>*****************"
    
    #5. 特殊符号
             echo "num = $num"   # 双引号是保留特殊字符
             echo 'num = $num'   # 单引号当做字符串
             echo `pwd`   # 反单引号解析为shell 命令
    
             echo "**************<>****************"
    
    #6. 环境变量
             echo "PATH=$PATH"
    
    #7. 算术运算
             num=5
             sum="expr $sum \* 6"
             echo "sum=$sum"
             echo $sum
             sum='expr $sum \* 6'
             echo "sum=$sum"
             echo $sum
             sum=`expr $num \* 6`
             echo "sum=$sum"
             echo $sum              
    
    #8. 逻辑运算
    
    # test 表达式
    # 比较字符串 比较整数 比较文件
    
    #9. shell 控制语句
    
    # if switch for while break ...
    
    # 方法一 判断输入参数的个数是否小于3
             if [ $# -lt 3 ]
             then
                       echo "argc is less than 3"
             else
                       echo "argc is great than 3"
             fi
    
    # 方法二
    
             if [ $# -lt 3 ] ; then
                       echo "argc is less than 3"
             else
                       echo "argc is great than 3"
             fi
    
             echo "******************************"
    
    # case esac 多路分支语句
    
             case $1 in
                                hello)
                                         echo "case: hello"
                                         ;;
                                sky)
                                         echo "case: sky"
                                         ;;
                                other)
                                         echo "case: other nothing"
                                         ;;
                                *)
                                         echo "case: * none"
                                         ;;
    
             esac
    
             echo "******************************"
    
    # for语句
             for name in $@
             do
             case $1 in
                                hello)
                                         echo "case: hello"
                                         ;;
    
                                sky)
                                         echo "case: sky"
                                         ;;
                                other)
                                         echo "case: other nothing"
                                         ;;
                                *)
                                         echo "case: * none"
                                         ;;
    
             esac
             done
             echo "******************************"
    
    #while语句
             num=10
             sum=0
             while [ $num -gt 0 ]
             do
                                sum=`expr $sum + $num`
                                num=`expr $num - 1`
             done
                                echo "sum=$sum"
             echo "******************************"
    
             #break and continue
             echo "**********break and continue*******************"
    
             if [ $# = 0 ] 
             then
                       echo "Numberic arguments required"
                       exit 
             fi
            
             if [ $# -gt 10 ]  #所有位置参数
             then
                       echo "Only ten arguments allowed"
                       exit 
             fi
     
             for number
             do
                       count=`expr $number % 2` #用2求模,count的值只能是0或1
                       if [ $count -eq 1 ]  # 是奇数
                       then
                                continue #下一轮循环
                       else
                                output="$output $number"  #偶数放到偶数队列中
                       fi
             done
             echo "Even number: $output"
    
             echo "******************************"        
    
    # 10. 函数调用
    # 函数不需要指定是返回什么类型
             my_func()
             {
                       set -x
                       echo "my function"
                       sum=`expr $1 + $2`
                       echo "sum=$sum"
                       return $sum
                       set +x
             }
             my_func 1 2
             echo "sum2=$?"
             echo "******************************"

     
    6. test 문장의 사용
    test 문 구 는 세 가지 대상 을 테스트 할 수 있 습 니 다.
           문자열  정수  문건
    모든 테스트 대상 에는 약간의 테스트 조작 부호 가 있다.
    예 를 들 면:
           test  “$answer”= “yes”
           변수 answer 의 값 이 문자열 yes 인지 여부
           test  $num  -eq  18
           변수 num 의 값 이 정수 18 인지 여부
           test  –d tmp
           tmp 가 디 렉 터 리 이름 인지 테스트 합 니 다.
     
  • 문자열 테스트
  • s1 = s2  두 문자열 의 내용 이 똑 같은 지 테스트 합 니 다.
    s1 != s2  두 문자열 의 내용 에 차이 가 있 는 지 테스트 합 니 다.
    -z s1     s1 문자열 의 길이 가 0 인지 테스트 합 니 다.
    -n s1     s1 문자열 의 길이 가 0 이 아 닌 지 테스트 합 니 다.
  • 정수 테스트
  • a –eq b  a 와 b 가 같은 지 테스트 합 니 다.
    a –ne b  a 와 b 가 같 지 않 은 지 테스트 합 니 다.
    a –gt b  a 가 b 보다 큰 지 테스트 하기
    a –ge b  a 가 b 보다 큰 지 테스트 합 니 다.
    a –lt b   a 가 b 보다 작은 지 테스트 하기
    a –le b   a 가 b 보다 작 는 지 테스트 합 니 다.
     
  • 파일 테스트
  • - d name 테스트 name 이 디 렉 터 리 인지 여부
    - f name 테스트 name 이 일반 파일 인지
    -L name  name 이 심 볼 릭 링크 인지 테스트 하기
    -r  name  name 파일 이 존재 하고 읽 을 수 있 는 지 테스트 합 니 다.
    -w  name   name 파일 이 존재 하고 쓸 수 있 는 지 테스트 합 니 다.
    -x  name  name 파일 이 존재 하고 실행 가능 한 지 테스트 합 니 다.
    -s  name   name 파일 이 존재 하 는 지, 길이 가 0 이 아 닌 지 테스트 합 니 다.
    f1 –nt f2   파일 f1 이 파일 f2 보다 업데이트 되 었 는 지 테스트 합 니 다.
    f1 –ot f2  파일 f1 이 파일 f2 보다 더 오래된 지 테스트 합 니 다.
     
    7. 셸 제어 문
    1)if…then…fi
    문법 구조:
             if  표현 식
                                then 명령 표
             fi
    표현 식 이 사실 이 라면 명령 표 의 명령 을 실행 합 니 다.그렇지 않 으 면 if 문 구 를 종료 하고 fi 뒤의 문 구 를 실행 합 니 다.
    if 와 fi 는 조건문 의 괄호 이 므 로 쌍 을 지어 사용 해 야 합 니 다.
    명령 표 의 명령 은 하나 일 수도 있 고 몇 개 일 수도 있다.
     
    2)case…esac
    다 중 분기 문 case 는 다 중 조건 테스트 에 사 용 됩 니 다. 문법 은 다음 과 같 습 니 다.
    case 문자열 변수 in
             모드 1)
                                명령 표 1
                                ;;
             모드 2)
                                명령 표 2
                                ;;
             ……
             모드 n)
                                명령 표 n
                                ;;
    esac
     
    주의:
    case 문 구 는 문자열 변수 만 감지 할 수 있 습 니 다.
    각 모드 에 서 는 괄호 가 있 는 파일 이름 의 메타 문 자 를 사용 할 수 있 습 니 다.
    명령 표 는 단독 2 점 줄 로 끝나 고 케이스 문 구 를 종료 합 니 다.
    모드 n 은 항상 문자 * 로 모든 다른 모드 를 표시 합 니 다.
    마지막 2 점 줄 은 생략 할 수 있다.
     
    3)for…do…done
    순환 횟수 가 알려 지 거나 확 정 될 때 for 순환 문 구 를 사용 하여 명령 을 여러 번 실행 합 니 다.순환 체 는 문장 괄호 do 와 done 에 의 해 한정 된다.형식:
    변수 이름  in  단어 표
             do
                       명령 표
             Done
    변 수 는 단어 표 의 각 단 어 를 순서대로 가 져 오고 단 어 를 가 져 올 때마다 순환 체 의 명령 을 실행 합 니 다.순환 횟수 는 단어 표 의 단어 수 에 의 해 확정 된다.명령 표 의 명령 은 하나 일 수도 있 고, 분점 이나 줄 바 꿈 문자 로 나 눌 수도 있다.
    단어 표 가 명령 행 의 모든 위치 매개 변수 일 경우 for 구문 에서 'in 단어 표' 부분 을 생략 할 수 있 습 니 다.
     
    4)while…do…done
    문법 구 조 는 다음 과 같다.
    while  명령 또는 표현 식
    do
             명령 표
    done
    while 문 구 는 먼저 다음 명령 이나 표현 식 의 값 을 테스트 합 니 다. 만약 사실 이 라면 순환 체 의 명령 을 한 번 실행 한 다음 에 이 명령 이나 표현 식 의 값 을 테스트 하고 순환 체 를 실행 합 니 다. 이 명령 이나 표현 식 이 가짜 일 때 까지 순환 을 종료 합 니 다.
    while 문장의 종료 상 태 는 명령 표 에서 실 행 된 마지막 명령 의 출시 상태 입 니 다.
     
    5)until…do…done
    문법 구조:
    until 명령 이나 표현 식
    do
             명령 표
    done
    until 순환 은 while 순환 기능 과 비슷 합 니 다. 테스트 명령 이나 표현 식 값 이 가짜 일 때 만 순환 체 의 명령 표를 실행 합 니 다. 그렇지 않 으 면 순환 을 종료 합 니 다.
     
    6) break 와 contine
    break  n 은 n 층 에서 뛰 어 내 리 는 것 을 나타 낸다.
    contine 문 구 는 바로 최근 순환 문장의 다음 순환 으로 갑 니 다.
    continue  n 은 최근 n 층 순환 문장의 다음 순환 으로 갑 니 다.
     
    8. 셸 프로 그래 밍 디 버 깅 기법
    1) 스 크 립 트 실행 결과 추적
    디 버 깅 을 시작 하 는 곳 에 추가: set – x
    디 버 깅 이 끝 난 곳 에 추가: set + x
     
     
    #一个循环测试的demo
    #!/bin/sh count=0 sum=0 while [ $count -le 5 ] do if [ $count = 3 ] then echo "break count=$count" break fi sum=`expr $sum + $count` count=`expr $count + 1` echo "count=$count" sleep 1 done echo "sum=$sum"

      #!/bin/sh                                                                                                                                echo "zbh" #if [ $1 = "1"]; then     cd .. && pwd  #fi     echo "zbh ******* end"
    이 파일 을 실행 할 때 source 를 사용 해 야 합 니 다. 그렇지 않 으 면 스 크 립 트 가 하위 프로 세 스에 서 실 행 됩 니 다. 현재 콘 솔 의 경 로 는 변 하지 않 습 니 다.
     
     
    교 류 를 환영 합 니 다. 다음은 제 연락처 입 니 다.
    qq:920052390
    시 나 닷 컴 블 로그:http://blog.sina.com.cn/u/2049150530
    블 로그 원:http://www.cnblogs.com/sky-heaven/
    아 는 바:http://www.zhihu.com/people/zhang-bing-hua

    좋은 웹페이지 즐겨찾기