[bash] 명령 행 인자, getopt 시리즈 명령 포맷 명령 행 문자열
5818 단어 shell명령 행 매개 변수 읽 기와 처리
#!/bin/bash
if [ -n "$1" ] #必须先测试参数是否读入(即命令行上是否真正传了参数),使用""括起来,参数允许是含有空格的字符串
#如果使用了未读入的参数会报错!
then
echo Have read it!
else
echo "Can't identify it!"
fi
fac=1
for (( n = 1; n <= $1; n++ ))#计算阶乘
do
fac=$[ $fac * $n ]
done
echo $fac
그 중에서 환경 변 수 는 $0 은 명령 명 자 체 를 나타 내 고 $1 ~ $9 는 다음 명령 행 인 자 를 나타 낸다.2. 여러 명령 행 인자 읽 기:
#!/bin/bash
echo The first parameter is $1
echo The second parameter is $2
echo The conduct is $[ $1 * $2 ] #计算两个参数的乘积
3. 매개 변 수 는 문자열 이 고 빈 칸 이 있 습 니 다:
#!/bin/bash
#如果参数字符串含有空格,则在输入命令的时候将含有空格的字符串用''或""括起来即可
echo Hello, $1!
4. 임의의 인자 읽 기:
#!/bin/bash
#超过第9号参数之后的参数引用的时候使用${}形式就行了
#通过这种方法可以读取任意多个参数
echo The tenth parameter is ${10}
echo The eleventh parameter is ${11}
5. 스 크 립 트 이름 을 읽 고 스 크 립 트 의 기본 이름 을 가 져 옵 니 다:
#!/bin/bash
echo The command entered is: $0 #命令行输入的名称如何输出就是如何
echo The command entered is: `basename $0` #获取文件的基名,可以去掉前面的路径只包含文件名本身
6. 환경 변수 $\# 를 이용 하여 인자 의 개 수 를 가 져 옵 니 다 (단 $0 은 포함 되 지 않 습 니 다):
#!/bin/bash
for (( i = 1; i <= $#; i++ ))
do
echo $i
done
간단 한 응용#!/bin/bash
if [ $# -ne 2 ] #如果错误的输入参数则提醒如何正确使用
then
echo Usage: test a b
else
echo $[ $1 + $2 ] #正确输入则输出求和
fi
7. ${! var} - 변 수 를 이용 하여 어떤 명령 행 인 자 를 구체 적 으로 사용 할 지 선택 하 십시오.
#!/bin/bash
echo ${!#} #获取最后一个参数
a=3
echo ${!a} #获取第三个参数
for (( i = 1; i <= $#; i++ )) #打印所有参数
do
echo ${!i}
done
8. 반복 명령 행 인자:
#!/bin/bash
echo \$*: $*
echo \$@: $@
#这两种方法(即$@和$*不用""括起来)
#则迭代时无视用命令输入时的"",即使是""里面的空格也会被当成参数的分隔符
for x in $*
do
echo $x
done
echo "*********"
for x in $@
do
echo $x
done
#会将整个命令行的所有参数当成一个迭代值
echo "*********"
for x in "$*"
do
echo $x
done
#将命令行参数逐个迭代,并将""括起来的参数视作一个迭代值(包括""中的空格)
#推荐使用!!!
echo "*********"
for x in "$@"
do
echo $x
done
#同上
echo "*********"
for (( i = 1; i <= $#; i++ ))
do
echo ${!i}
done
9. shift 명령 으로 인자 이동:
#!/bin/bash
while [ -n "$1" ]
do
echo $1
shift #不带参数默认将所有参数左移一位,这样$4变成#3,$3变成$2,而$1将被永久丢弃(即被删除,不可恢复),但$0始终不会变,永远都是命令名
done
while [ -n "$1" ]
do
echo $1
shift 2 #一次左移两个参数
done
10. 표준 명령 행 형식 과 getopt 명령:
표준 명령 행 형식 은 명령 명 [- 옵션 1 옵션 1 의 매개 변수 목록] [- 옵션 2 옵션 2 의 매개 변수 목록].. - 매개 변수 1 매개 변수 2
여러 옵션 의 통합 도 지원 합 니 다. 예 를 들 어 - abc.
getopt 명령 은 입력 한 난잡 한 명령 을 표준 형식 으로 포맷 할 수 있 습 니 다.
#!/bin/bash
#首先getopt的第一个参数是一个字符串optstring
#其中定义了所有的命令选项,共有abcde这5种选项
#其中:表示选项b后面带一个选项参数,只能是一个,如果输入命令的时候有多个会出问题
#下一个参数就是命令输入时的选项和参数的字符串
echo `getopt ab:cde -ab sdf -cdef dsf "sdfk sdf" 1 23424`
#输出为-a -b sdf -c -d -e -- dsf sdfk sdf 1 23424
#--用以分隔选项部分和参数部分
11. getopt, case, shift 를 사용 하여 명령 해석:
#!/bin/bash
set -- `getopt -q ab:cde "$@"` #利用set命令将原始命令行参数的值替换成格式化后的值
#在Linux中如果输入了不存在的选项,则在使用getopt进行格式化时会报错
#提示你使用了不存在的非法选项,但是无论如何getopt命令最终转化后的标准形式
#都是忽略不存在的选项的,因此可以给getopt命令添加一个选项-q使其不输出错误信息
#即set -- `getopt -q ab:cde "$@"`
while [ -n "$1" ]
do
case "$1" in
-a) echo Found the -a option;;
-b) echo Found the -b option, with parameter $2
shift;; #需要额外shift掉选项参数
-c) echo Found the -c option;;
-d) echo Found the -d option;;
-e) echo Found the -e option;;
--) shift #getopt会化成标准命令行参数形式,以--作为选项和参数的间隔
break;; #表示选项部分已经读取完毕,跳出循环接着读取参数部分
*) echo $1 is not an option;; #getopt会自动忽略不存在的选项,因此这条语句多余,放在这里只是做一个提醒!
esac
shift
done
cnt=1
while [ -n "$1" ]
do
echo Parameter $cnt: $1
cnt=$[ $cnt + 1 ]
shift
done
$ bash test.sh -afcb 3224 -de sdkjf 234 ssD
#output:
getopt: illegal option -- f
Found the -a option
Found the -c option
Found the -b option, with parameter 3224
Found the -d option
Found the -e option
Parameter 1: sdkjf
Parameter 2: 234
안 타 깝 게 도 getopt 는 빈 칸 이 있 는 인 자 를 처리 하 는 데 익숙 하지 않 습 니 다. 예 를 들 어 'sdf sdf' getopt 는 sdf 와 sdf 두 개의 매개 변수 로 처리 하고 '' '의 역할 을 무시 합 니 다.12. while 와 더 높 은 getopts 명령 을 사용 하여 j 명령 행 인 자 를 분석 합 니 다.
getopts 더 높 은 곳:
1) 옵션 부분 을 분석 한 후 원본 명령 행 매개 변수 문자열 의 값 은 변 하지 않 습 니 다.
2) 매개 변수 에 있 는 빈 칸 (매개 변수 문자열 에 빈 칸 포함) 을 식별 할 수 있 습 니 다.
3) 옵션 과 옵션 매개 변 수 를 연결 하여 쓰 는 것 을 지원 합 니 다.
4) 존재 하지 않 는 (불법) 옵션 을 하나 로 해석 합 니까?기 호 는 프로그래머 가 자동 으로 무시 하 는 것 이 아니 라 판단 하도록 제공 합 니 다.
#!/bin/bash
#当选项部分全部解析完之后getopts命令会返回非0我们而自动退出循环
#将剩下的参数部分留给你处理
#并且循环过程中不需要shift,这就意味着循环退出后并不会影响原始的命令行参数值
#两个环境变量,$OPTIND表示当前处理到了几号参数,如果选项和选项参数写在一起则会当成一个,分开则会当成两个参数
#getopts命令会将每次解析出来的选项存入自定义的变量opt中,而选项参数则存入环境变量$OPTARG中
#getopts的第一个参数仍然是optstring,意义和getopt命令的optstring参数一样,只不过如果在开头加一个:的效果和getopt的-q选项一样,都表示忽略非法的选项
while getopts :ab:c opt
do
echo $OPTIND
case $opt in
a) echo Found the -a option;; #第一个和getopt不一样的地方,解析后会去掉-符号
b) echo Found the -b option, with value $OPTARG;;
c) echo Found the -c option;;
*) echo Unknown option: $opt;; #对于非法的选项会返回一个符号?并且$OPTIND不做计数
esac
done
shift $[ $OPTIND - 1 ] #选项解析后$OPTIND停留在选项之后的第一个参数上,所以要左移OPTIND - 1位从而将选项部分去掉
echo "********"
for var in "$@"
do
echo $var
done
$ bash test.sh -axbsdf134 -c sdkf 234 sfd iii "45sd xxxx"
#这里体现出了getops的三大新亮点
#output:
1
Found the -a option
1
Unknown option: ? #一:对于不存在的(即非法的)选项将返回字符?
2
Found the -b option, with value sdf134 #二:对于选项字母和选项参数写在一起的也能解析
3
Found the -c option #选项部分解析完之后getopts命令能返回大于0的状态码而自动退出while循环
********
sdkf
234
sfd
iii
45sd xxxx #三:参数中多个连续的空格会当成一个空格,这里getopts对空格敏感
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
✨〰️ ZI 〰️✨ Vim 구문❮ ZI ❯ 🧙♀️ Zsh를 위한 스위스 아미 나이프. 모든 것을 함께 붙일 수 있도록 설계되었습니다. zsh 유형의 파일에 있는 명령에 대한 Vim 구문 정의입니다. 📥 설치 Vim 플러그인으로 로드합니다. 예를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.