[记录]Shell中的getopts和getopt用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
Shell中的getopts和getopt用法
1.getopts
getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果字符后面带有“:”,表示这个字符有自己的参数。getopts从命令中获取这些参数,并且删去了“-”,并将其赋值在第二个参数中,如果带有自己参数,这个参数赋值在“optarg”中。提供getopts的shell内置了这里变量$optarg存储相应选项的参数,而$optind总是存储原始$*中下一个要处理的元素位置。while getopts ":a:bc" opt  #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数.
例子:
#cat getopts.sh
#!/bin/bash
 
echo $* 
while getopts ":a:bc" opt 
do 
  case $opt in 
    a )
      echo $optarg 
      echo $optind
      ;; 
    b )
      echo "b $optind"
      ;; 
    c )
      echo "c $optind"
      ;; 
    ? )
      echo "error" 
      exit 1
      ;; 
  esac 
done 
echo $optind 
shift $(($optind - 1)) 
#通过shift $(($optind - 1))的处理,$*中就只保留了除去选项内容的参数,可以在其后进行正常的shell编程处理了。 
echo $0 
echo $* 
执行命令:
./getopts.sh -a 11 -b -c 
-a 11 -b -c 
11 
b 4 
c 5 
./getopts.sh
 
2.getopt
getopt(一个外部工具)具体用用法可以#man getopt
#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项,如-carg 而不能是-c arg
#--long表示长选项
例子:
#cat getopt.sh
#!/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! 
#会将符合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)   
      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 
运行命令:
./getopt.sh --b-long abc -a -c33 remain 
option b, argument `abc' 
option a 
option c, argument `33' 
remaining arguments: 
--> `remain' 

  

posted @   wsjhk  阅读(655)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示