http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html
上面一节研究到这个问题,我们在命令里面常常会指定参数,例如:
$ command -p -v -k 1 file
这样子,如果是这种情况,在函数里面我们如何来获取参数呢?
常规的按位置获取的参数可以参考下表:
表 1. 函数的 Shell 参数
参数 | 目的 |
---|---|
0, 1, 2, … | 位置参数从参数 0 开始。参数 0 引用启动 bash 的程序的名称,如果函数在 shell 脚本中运行,则引用 shell 脚本的名称。有关该参数的其他信息,比如 bash 由 -c 参数启动,请参阅 bash 手册页面。由单引号或双引号包围的字符串被作为一个参数进行传递,传递时会去掉引号。 如果是双引号,则在调用函数之前将对 $HOME 之类的 shell 变量进行扩展。对于包含嵌入空白或其他字符(这些空白或字符可能对 shell 有特殊意义)的参数,需要使用单引号或双引号进行传递。 |
* | 位置参数从参数 1 开始。如果在双引号中进行扩展,则扩展就是一个词,由 IFS 特殊变量的第一个字符将参数分开,如果 IFS 为空,则没有间隔空格。IFS 的默认值是空白、制表符和换行符。如果没有设置 IFS,则使用空白作为分隔符(仅对默认 IFS 而言)。 |
@ | 位置参数从参数 1 开始。如果在双引号中进行扩展,则每个参数都会成为一个词,因此 “$@” 与 “$1” “$2” 等效。如果参数有可能包含嵌入空白,那么您将需要使用这种形式。 |
# | 参数数量(不包含参数 0)。 |
shift 命令
调用 shift 命令可以从参数列里面删除第一个保留余下的,例如:
#!/bin/bash
# Filename: arg.sh
echo $#
while [ $# -ge 1 ];
do
echo $1; shift
done
调用的效果:
$ ./arg.sh one two three
3
one
two
three
type 命令
使用 type 命令可以打印函数的内容。
$ func() {
> echo $@
> }
$ type func
func 是函数
func() {
echo $@
}
选项和 getopts
看一下这个 testopt.sh
#!/bin/bash
echo "OPTIND starts at $OPTIND"
while getopts ":pq:" optname
do
case "$optname" in
"p") "Option $optname is specified";;
"q") echo "Option $optname has value $OPTARG";;
"?") echo "Unknown option $OPTARG";;
":") echo "No argument value for option $OPTARG";;
# Should not occur
*) echo "Unknown error while processing options";;
esac
echo "OPTIND is now $OPTIND"
done
首先介绍一下变量:
PS: c 也有 getopt 函数,用于实现类似的功能。
【转载请附】愿以此功德,回向 >>
原文链接:http://www.huangwenchao.com.cn/2015/12/bash-shell-10.html【每日一SHELL (10) 函数和参数 – 增强版】