셸 스 크 립 트 의 일부 매개 변수 처리

15563 단어 shell
필요 설명:
셸 스 크 립 트 를 쓸 때 이러한 요구 가 있 습 니 다. 스 크 립 트 는 실행 과정 에서 인 자 를 입력 해 야 합 니 다. 스 크 립 트 에 전달 되 는 인자 가 없 으 면 해당 스 크 립 트 사용 방법 이나 예 를 들 어 스 크 립 트 뒤에 어떤 인 자 를 추가 해 야 하 는 지 알려 줍 니 다.그래서 여기 서 해 야 할 일 은 현재 스 크 립 트 에 전 달 된 매개 변수의 수량 을 알 고 0 개 라면 사용 설명 을 실행 하 는 것 입 니 다.
실현 방법:
스 크 립 트 에서 현재 스 크 립 트 에 전 달 된 인자 의 수 를 $\# 로 판단 합 니 다.
#!/bin/bash

echo $#

테스트 과정:
각각 여러 개의 인 자 를 입력 하고 스 크 립 트 를 실행 하여 실행 결 과 를 봅 니 다.
[root@redhat6 ~]# ./ts.sh para1
1
[root@redhat6 ~]# ./ts.sh para1 para2
2
[root@redhat6 ~]# ./ts.sh para1 para2 para3
3
[root@redhat6 ~]# ./ts.sh para1 para2 para3 para4
4
[root@redhat6 ~]# ./ts.sh para1 para2 para3 para4 para5
5

설명: 이상 의 실행 결 과 를 통 해 알 수 있 듯 이 $\# 의 수량 은 스 크 립 트 에 전 달 된 매개 변수의 수량 은 $1 부터 계 산 됩 니 다. $1 의 위치 에 내용 이 있 으 면 1, $1 $2 의 위치 에 내용 이 있 으 면 2 로 계 산 됩 니 다.
  :$0     ,     , $1    。

들 어 오 는 인자 의 수가 0 이면 스 크 립 트 사용 방법 을 표시 합 니 다.
if [ $# -eq 0 ];
then
    usage
    exit
fi

비고: usage 는 사용자 정의 함수 입 니 다. 여 기 는 프 리 젠 테 이 션 호출 일 뿐 구체 적 인 상황 은 이 함 수 를 스스로 정의 해 야 합 니 다.
인자 가 있 는 지 판단 하기
#!/bin/bash

if [ x$1 != x ]
then
    #...   
else
    #...    
fi

기초 지식
매개 변수 처리 - 셸 입력 매개 변수 처리
1. $#           
2. $*                    。       ,        9 
3. $$          ID 
4. $!               ID 
5. $@  $#  ,        ,           
6. $-   shell       , set      
7. $?            。0      ,          。

변수 의미
$0      
$1      #1 
$2 - $9      #2 - #9 
${10}      #10 
$#         
"$*"        (       ) * 
"$@"        (           ) 
${#*}                 
${#@}                 
$?     
$$      ID(PID) 
$-          (  set) 
$_             
$!                ID(PID)

셸 처 리 를 사용 할 때 매개 변 수 를 처리 하 는 것 은 기본 모듈 이기 때문에 오늘 은 간단 하고 알 기 쉬 운 글 을 찾 아 참고 하 십시오. 앞으로 셸 매개 변수 처리 템 플 릿 으로 getOpts 형식 으로 매개 변 수 를 처리 하 는 것 을 추천 합 니 다.
머리말
프로그램 을 쓸 때 명령 행 인 자 를 처리 해 야 합 니 다. 본 고 는 Bash 에서 명령 행 처리 방식 을 설명 합 니 다.
옵션 과 인자:
다음 명령 행:
./test.sh -f config.conf -v --prefix=/home

우 리 는 - f 를 옵션 이 라 고 부 릅 니 다. config. conf, - v 도 하나의 옵션 이 필요 하지만 매개 변 수 는 필요 없습니다.
– prefix 우 리 는 긴 옵션 이 라 고 부 릅 니 다. 즉, 옵션 자체 가 한 글자 보다 많 습 니 다. 또한 하나의 매개 변수 가 필요 합 니 다. 등호 로 연결 해 야 합 니 다. 물론 등호 가 필요 한 것 이 아 닙 니 다./home 은 – prefix 뒤에 직접 쓸 수 있 습 니 다. 즉, – prefix/home, 더 많은 제한 후 가면 에서 느 낄 수 있 습 니 다.bash 에서 다음 과 같은 세 가지 방식 으로 명령 행 인 자 를 처리 할 수 있 고 모든 방식 은 자신의 응용 장면 이 있다.
*       
* getopts
* getopt

다음 에 우 리 는 차례대로 이 세 가지 처리 방식 을 토론 한다.
  • 수공 처리 방식 은 수공 처리 방식 에서 먼저 몇 가지 변 수 를 알 아야 합 니까? 아니면 위의 명령 행위 예 를 들 어야 합 니까?
     $0 : ./test.sh,     ,   C/C++  argv[0]
     $1 : -f,     .
     $2 : config.conf
     $3, $4 ... :  。
     $#      ,       ,   $# 4.
     $@ :       ,        ,     -f config.conf -v --prefix=/home
     $* : $@  , "$*"   "$@"(   )   ,"$*"              , "$@"       。
    
  • 다음 과 같은 예 에서 보 듯 이:
     #!/bin/bash
    for arg in "$*"
    do
         echo $arg
    done
    for arg in "$@"
    do
        echo $arg
    done
    
      ./test.sh -f config.conf -n 10    :
    -f config.conf -n 10    #  "$*"   
    -f   #   $@   
    config.conf
    -n
    10
    

    그래서 수 동 으로 처리 하 는 방식 은 바로 이러한 변수 에 대한 처리 이다.수 동 처리 높이 는 명령 행 에서 전 달 된 매개 변수의 위치 에 의존 하기 때문에 일반적으로 비교적 간단 한 매개 변수 만 처리 합 니 다.... 와 같다
    ./test.sh 10
    

    .../test - n 10 이라는 옵션 을 가 진 방식 은 거의 사용 되 지 않 습 니 다.전형 적 인 용법 은 다음 과 같다.
    #!/bin/bash
    
    if [ x$1 != x ]
    then
        #...   
    else
    then
        #...    
    fi
    

    왜 x $1 을 사용 합 니까? =x 이런 식 으로 비교 해 볼 까요?이런 방식 의 비 교 를 상상 해 보 세 요.
    if [ -n $1 ] #$1   
    

    그러나 사용자 가 인 자 를 전달 하지 않 을 때 $1 이 비어 있 으 면 [n] 이 되 기 때문에 보조 문자열 을 추가 하여 비교 해 야 합 니 다.수 동 처리 방식 은 대부분의 간단 한 수 요 를 만족 시 킬 수 있 고 shift 와 함께 사용 해도 강력 한 기능 을 구성 할 수 있 지만 복잡 한 옵션 을 처리 할 때 다음 과 같은 두 가지 방법 을 사용 하 는 것 을 권장 합 니 다.
    2、getopts/getopt
    명령 행 인 자 를 처리 하 는 것 은 비슷 하고 복잡 한 일 입 니 다. 이 를 위해 C 는 getopt/getopt 를 제공 합 니 다.long 등 함수, C++ 의 boost 는 Options 라 이브 러 리 를 제공 합 니 다. 셸 에서 이 일 을 처리 하 는 것 은 getopts 와 getopt 입 니 다.
    getopts 와 getopt 기능 은 비슷 하지만 완전히 같 지 않 습 니 다. 그 중에서 getopt 는 독립 적 으로 실행 가능 한 파일 이 고 getopts 는 Bash 에 내 장 됩 니 다.
    먼저 매개 변수 전달 의 전형 적 인 용법 을 살 펴 보 자.
    ./test.sh -a -b -c :    ,       
    ./test.sh -abc   :    ,           ,            。
    ./test.sh -a args -b -c :   ,  -a    , -b -c    。
    ./test.sh --a-long=args --b-long :   
    

    getopts 를 먼저 보 겠 습 니 다. 긴 옵션 은 지원 되 지 않 습 니 다.
    getopts 를 사용 하 는 것 은 매우 간단 합 니 다: 코드
    #test.sh
    
    #!/bin/bash
    
    while getopts "a:bc" arg #                
    do
            case $arg in
                 a)
                    echo "a's arg:$OPTARG" #    $OPTARG 
                    ;;
                 b)
                    echo "b"
                    ;;
                 c)
                    echo "c"
                    ;;
                 ?) #           arg ?
                echo "unkonw argument"
            exit 1
            ;;
            esac
    done
    

    현재 사용 가능:
    ./test.sh -a arg -b -c 
    

    혹시
    ./test.sh -a arg -bc
    

    로드 하 러 왔 습 니 다.절대 다수의 스 크 립 트 가 이 함 수 를 사용 하면 된다 고 해 야 합 니 다. 긴 옵션 과 선택 가능 한 인 자 를 지원 하려 면 getopt 를 사용 해 야 합 니 다. 다음은 getopt 자체 의 예 입 니 다.
    #!/bin/bash
    
    # A small example program for using the new getopt(1) program.
    # This program will only work with bash(1)
    # An similar program using the tcsh(1) script language can be found
    # as parse.tcsh
    
    # Example input and output (from the bash prompt):
    # ./parse.bash -a par1 'another arg' --c-long 'wow!*/?' -cmore -b " very long "
    # Option a
    # Option c, no argument
    # Option c, argument `more'
    # Option b, argument ` very long '
    # Remaining arguments:
    # --> `par1'
    # --> `another arg'
    # --> `wow!*/?'
    
    # Note that we use `"$@"' to let each command-line parameter expand to a
    # separate word. The quotes around `$@' are essential!
    # We need TEMP as the `eval set --' would nuke the return value of getopt.
    
    #-o     ,                ,          
    # -carg     -c arg
    #--long     
    #"$@"      
    # -n:      
    

    예 를 들 어 이해 하기 쉽다. 우 리 는 '- f' 라 는 디 렉 터 리 를 만 들 려 고 하 는데 어떻게 하 시 겠 습 니까?
    mkdir -f #   ,  -f  mkdir       ,       
    mkdir -- -f   -f        。
    TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: /
     -n 'example.bash' -- "$@"`
    if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
    Note the quotes around `$TEMP': they are essential!
    set           ,     $1,$2...$n  ,    getopt       
    eval set -- "$TEMP"
    

    getopt 의 처 리 를 거 쳐 구체 적 인 옵션 을 처리 합 니 다.
    while true ; do
            case "$1" in
                    -a|--a-long) echo "Option a" ; shift ;;
                    -b|--b-long) echo "Option b, argument /`$2'" ; shift 2 ;;
                    -c|--c-long)
                            # c has an optional argument. As we are in quoted mode,
                            # an empty parameter will be generated if its optional
                            # argument is not found.
                            case "$2" in
                                    "") echo "Option c, no argument"; shift 2 ;;
                                    *) echo "Option c, argument /`$2'" ; shift 2 ;;
                            esac ;;
                    --) shift ; break ;;
                    *) echo "Internal error!" ; exit 1 ;;
            esac
    done
    echo "Remaining arguments:"
    for arg do
       echo '--> '"/`$arg'" ;
    done
    

    우리
    ./test -a -b arg arg1 -c 
    

    명령 줄 에 arg 1 인자 가 하나 더 있 는 것 을 볼 수 있 습 니 다. getopt 와 set 를 거 친 후에 명령 줄 은 다음 과 같 습 니 다.
    -a -b arg -c -- arg1
    

    $1 지향 - a, $2 지향 - b, $3 지향 arg, $4 지향 - c, $5 지향 -, 더 많은 arg 1 은 마지막 에 놓 여 있 습 니 다.
    3. 총화
    일반적인 작은 스 크 립 트 는 손 으로 처리 하면 충분 할 것 입 니 다. getopts 는 절대 다수의 상황 을 처리 할 수 있 고 getopt 는 복잡 하 며 기능 도 더욱 강 합 니 다.
    shift 는 사실 매우 간단 합 니 다. 바로 왼쪽 매개 변수 목록 입 니 다. shift 는 한 번 에 가장 왼쪽 매개 변 수 를 $1 로 옮 겼 습 니 다. 그리고 원래 의 $2 는 지금 $1 로 바 뀌 었 습 니 다.
    shift 뒤에 숫자 를 가 져 올 수 있 습 니 다. 몇 개의 인 자 를 옮 겨 야 하 는 지 알려 줍 니 다. 예 를 들 어 shift 3 은 3 개의 인 자 를 옮 긴 다음 에 원래 의 $4 는 현재 의 $1 이 됩 니 다.
    eval 은 먼저 뒤의 매개 변 수 를 한 번 실행 하고 필요 한 교환 을 모두 한 다음 에 명령 을 집행 하 는 것 입 니 다.예 를 들 어:
    MYFILE="cat myfile" 
    echo $MYFILE   # output: cat myfile 
    eval $MYFILE   # output: contents of myfile
    

    좀 더 상세 한 예 를 들다.
    #!/bin/bash 
    # evalit 
    echo " Total number of arguments passed: $#" 
    echo " The process ID: $$" 
    echo " Last argument: " $(eval echo /$$#) 
        : 
    $ ./evalit alpha bravo charlie 
    output as follows: 
    Total number of arguments passed: 3 
    The process ID: 780 
    Last argument:   charlie
    
        
    for i in `cat abc.txt`
    do
    echo $i
    done
    

    전송:https://www.cnblogs.com/bluecoder/p/3793316.html https://www.cnblogs.com/chuanzhang053/p/8530191.html

    좋은 웹페이지 즐겨찾기