셸 스 크 립 트 읽 기 명령 행 인자 구현
셸 프로그램 을 작성 할 때 명령 행 인 자 를 처리 해 야 합 니 다.
옵션 과 인자:
다음 명령 행:
./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 에 내장 되 어 있 습 니 다.
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 는 복잡 하 며 기능 도 더욱 강 합 니 다.
셸 스 크 립 트 읽 기 명령 행 매개 변수 구현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 셸 읽 기 명령 행 매개 변수 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.