셸 스 크 립 트 의 일부 매개 변수 처리
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.