Last active
August 8, 2020 04:16
-
-
Save princewang1994/e189fab68d6ba25f36f4b894a3fb6f3b to your computer and use it in GitHub Desktop.
bash使用getopts/getopt处理选项
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> | |
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# 注意,getopts不支持长选项 | |
a=default_a #默认参数 | |
b=0 | |
c=0 | |
while getopts "a:bc" arg #选项后面的冒号表示该选项需要参数 | |
do | |
case $arg in | |
a) | |
a=$OPTARG #参数存在$OPTARG中 | |
;; | |
b) | |
b=1 | |
;; | |
c) | |
c=1 | |
;; | |
?) #当有不认识的选项的时候arg为? | |
echo "unkonw argument" | |
exit 1 | |
;; | |
esac | |
done | |
echo "a=$a" | |
echo "b=$b" | |
echo "c=$c" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment