处理命令行参数的三种方式:
- 手工处理
- getopts
- getopt
一个命令行参数的完整信息,无外乎下面几部分($为取值符):
- 命令叫什么?$0
- 参数有多少个?$#
- 如何取指定位置的参数?$1~$n(n为参数位置,从1开始)
- 打印所有参数?$*(所有参数为一个字符串)
- 遍历所有参数?$@(所有参数组成一个数组,for循环轮循)
其它变量说明:
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
使用场景
手工处理依赖于参数位置,只适合参数比较明确、简单的场景
处理方法:以脚本foo.sh为例
<p class="p1">#!/bin/sh</p>echo "命令名称:"$0
echo "第一个参数:"$1
echo "参数个数:"$#
echo "参数串\$*:"$*
echo "参数串\"\$*\"":"$*"
echo "参数数组:"$@
$ ./foo.sh -f config.conf -n 10
命令名称:./foo.sh
第一个参数:-f
参数个数:4
参数串$*:-f config.conf -n 10
参数串"$*":-f config.conf -n 10
参数数组:-f config.conf -n 10
$*和$@都是将参数转换为数组,但是加上双引号既"$*"则转换为字符串,"$@"仍然事数组,下面代码验证:
echo "遍历\"\$*\":"
for arg in "$*"
do
echo $arg
done
echo "遍历\$*:"
for arg in $*
do
echo $arg
done
echo "遍历\$@:"
for arg in $@
do
echo $arg
done
echo "遍历\"\$@\":"
for arg in $@
do
echo $arg
done
输入命令行参数
$./foo.sh -f config.conf -n 10
结果如下:
遍历"$*":
-f config.conf -n 10
遍历$*:
-f
config.conf
-n
10
遍历$@:
-f
config.conf
-n
10
遍历"$@":
-f
config.conf
-n
10
可见$*和"$*"的区别
下面将讲解getopt和getopts种解析方法
getopt和getopts的异同:
getopt是独立的可执行文件,而getopts是由Bash内置的。
$type getopt
getopt is /usr/bin/getopt
$type getopts
getopts is a shell builtin
$type getopt
getopt is /usr/bin/getopt
$type getopts<pre name="code" class="java">$type getopt
getopt is /usr/bin/getopt
$type getopts
getopts is a shell builtin
<ul><li>
</li></ul>
getopts is a shell builtin
getopts
使用场景
处理方法
getopt
使用场景
处理方法
getopts源码详解
getopt源码详解
知道如何查看命令的语法,查到后能看懂语法,那么用别人写好的命令的能力已经具备了。下面讲一讲别人是如何实现这个命令的,自己如何写一个命令供别人使用。
普通参数:
http://blog.csdn.net/qzwujiaying/article/details/6371246