셸 스 크 립 트 읽 기 명령 행 인자 구현

전제 조건
셸 프로그램 을 작성 할 때 명령 행 인 자 를 처리 해 야 합 니 다.
옵션 과 인자:
다음 명령 행:

./test.sh -f config.conf -v --prefix=/home
-f 를 선택 하면 config.conf 라 는 인자 가 필요 합 니 다.
-v 도 하나의 옵션 이지 만 인자 가 필요 없습니다.
--prefix 우 리 는 긴 옵션 이 라 고 부 릅 니 다.즉,옵션 자체 가 한 글자 보다 많 고 매개 변수 도 필요 합 니 다.등호 로 연결 해 야 합 니 다.물론 등호 가 필요 한 것 은 아 닙 니 다.
/home 은--prefix 뒤에--prefix/home,
더 많은 제한 을 받 은 후에 가면 은 말 했다.
1.수 동 처리 방식(검증 됨)
수 동 처리 방식 에서 먼저 몇 개의 변 수 를 알 아야 합 니까?아니면 위의 명령 행 위 를 예 로 들 어야 합 니까?
$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 이런 방식 으로 비교 해 볼 까요?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 은 마지막 에 놓 였 다.
    총화
    일반적인 작은 스 크 립 트 는 손 으로 처리 하면 충분 합 니 다.getopts 는 절대 다수의 상황 을 처리 할 수 있 고 getopt 는 복잡 하 며 기능 도 더욱 강 합 니 다.
    셸 스 크 립 트 읽 기 명령 행 매개 변수 구현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 셸 읽 기 명령 행 매개 변수 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기