linux shell 输入参数总结
for last; do true; done
echo $last
这一个也很漂亮(再次,应该使用bash,ksh和sh),它不移动参数,这可能是很好的。
它使用的事实是,如果你不告诉它什么循环,隐含循环的参数,以及事实,循环变量没有作用域:它们保持它们设置的最后一个值。
getopts optstring name [arg ...]
optstring列出了对应的shell 脚本可以识别的所有参数。比如:shell script可以识别-a, -f 以及-s参数,则optstring就是afs;如果对应的参数后面还跟随一个值,则在相应的optstring后面加冒号。比如a:fs表示a参数后面会有一个值出现,-a value的形式。另外,getopts执行匹配到a的时候,会把value存放在一个OPTARG的shell 变量中。如果optstring是以冒号开头的,命令行当中出现了optstring当中没有的参数将不会提示错误信息。
name表示的是参数的名称,每次执行getopts,会从命令行当中获取下一个参数,然后存放到name中。如果获取到参数不在optstring中,则name的值被设置为?。命令行当中的所有参数都有一个index,第一个参数从1开始,依次类推,另外有一个名为OPTIND的shell变量存放下一个要处理的参数的index。
#!/bin/bash func() { echo "Usage:" echo "test.sh [-j S_DIR] [-m D_DIR]" echo "Description:" echo "S_DIR,the path of source." echo "D_DIR,the path of destination." exit -1 } upload="false" while getopts 'h:j:m:u' OPT; do case $OPT in j) S_DIR="$OPTARG";; m) D_DIR="$OPTARG";; u) upload="true";; h) func;; ?) func;; esac done echo $S_DIR echo $D_DIR echo $upload //执行结果: [root@bobo tmp] sh test.sh -j /data/usw/web -m /opt/data/web /data/usw/web /opt/data/web false [root@bobo tmp] sh test.sh -j /data/usw/web -m /opt/data/web -u /data/usw/web /opt/data/web true [root@bobo tmp] sh test.sh -j /data/usw/web /data/usw/web false [root@bobo tmp] sh test.sh -m /opt/data/web /opt/data/web false [root@bobo tmp] sh test.sh -h test.sh: option requires an argument -- h Usage: test.sh [-j S_DIR] [-m D_DIR] Description: S_DIR,the path of source. D_DIR,the path of destination. [root@bobo tmp] sh test.sh j false [root@bobo tmp] sh test.sh j m false
getopts后面跟的字符串就是参数列表,每个字母代表一个选项,如果字母后面跟一个冒号,则表示这个选项还会有一个值,比如-j /data/usr/web 和 -m /opt/data/web。而getopts字符串中没有跟随冒号的字母就是开关型的选项,不需要指定值,等同于true/false,只要带上这个参数就是true。
shift位移使用举例:
#!/bin/bash #test3.sh func() { echo "Usage:" echo "test.sh [-j S_DIR] [-m D_DIR]" echo "Description:" echo "S_DIR, the path of source." echo "D_DIR, the path of destination." exit -1 } upload="false" echo $OPTIND while getopts 'h:s:d:u' OPT; do case $OPT in s) S_DIR="$OPTARG";; d) D_DIR="$OPTARG";; u) upload="true";; h) func;; ?) func;; esac done echo $OPTIND echo $(($OPTIND -)) echo $1 //执行结果: [root@bobo tmp] sh test3.sh -s /data/usw/web beijing 1 #执行的是第一个"echo $OPTIND" 3 #执行的是第二个"echo $OPTIND" beijing #此时$1是"beijing" [root@bobo tmp] sh test3.sh -s /opt/data/web beijing 1 #执行的是第一个"echo $OPTIND" 3 #执行的是第二个"echo $OPTIND" beijing [root@bobo tmp] sh test3.sh -s /data/usw/web -d /opt/data/web beijing 1 #执行的是第一个"echo $OPTIND" 5 #执行的是第二个"echo $OPTIND" beijing 参数位置: 1 2 3 4 5 6 [root@bobo tmp] sh test3.sh -s /data/usw/web -d /opt/data/web -u beijing 6 beijing
参考资料
http://www.voidcn.com/article/p-ejbacwbp-bsh.html
https://www.clarkhu.net/?p=5883

浙公网安备 33010602011771号