每日一SHELL (10) 函数和参数 – 增强版

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 函数,用于实现类似的功能。


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2015/12/bash-shell-10.html【每日一SHELL (10) 函数和参数 – 增强版】

发表评论

电子邮件地址不会被公开。 必填项已用*标注