GNU Bash 手册 (4)

3.3 Shell函数
=============
                                                                                                                          
    函数用来将一组命令组合起来, 并赋予该组命令一个名字, 以便以后执行. 执行
这组命令就像执行一个'常规'命令一样. 当一个shell函数的名字被当作一个简单
命令执行时, 和这个函数名相关联的一组命令被执行. Shell函数在当前shell环境
中执行, 解释它们不需要生成新的进程.
                                                                                                                          
    函数用以下语法来声明:
        ['function'] NAME () COMPOUND-COMMAND [ REDIRECTIONS ]
    这样就定义了一个名为NAME的shell函数. 保留字'function'是可选的. 如果采用
了保留字'function', 那么小括号是可选的. 函数体是复合命令COMPOUND-COMMAND(*
参见 3.2.4复合命令::). 该命令通常是用{和}括住的一个LIST, 但也可以是上文列出
的任意复合命令. 每当NAME被指定为一个命令的名字时, COMPOUND-COMMAND就会被执
行. 当函数被运行时, 所有重定向(*参见 3.6 重定向::)也要被执行.
                                                                                                                          
    可以使用内部命令unset(*参见 4.1 Bourne Shell内部命令::)的'-f'选项来取消某个
函数的定义.
                                                                                                                          
    函数定义在正常情况下的退出状态为0, 如果定义存在语法错误或一个同名的可读
函数已经被定义了, 那么退出状态为非0. 当函数被执行时, 函数的退出状态是函数体
中最后一个执行的命令的退出状态.
                                                                                                                          
    注意, 由于历史原因, 最常见的用法中, 包围函数体的花括号必须用'空白'与函数
体隔开. 这是因为花括号是保留字, 因此只有它们被空白符隔开时才能被识别出来.
另外, 当使用花括号时, LIST必须以分号, '&', 或newline结尾.
                                                                                                                   
    当函数执行时, 函数的变元是它执行期间的位置参数(*参见 3.4.1 位置参数::).
特殊参数'#'被扩展并更新为位置参数的个数. 特殊参数意义'0'不变. 当函数执行
时, 变量'FUNCNAME'的第一个元素被设置为函数的名字. 对于shell执行环境的所有
其他方面, 除了'DEBUG'和'RETURN'陷阱('trap')没有被继承这种情况外, 被调函数
和他的调用者是完全一样的. 可以使用'declare'内部命令设置函数的'trace'属性,
或启用'set'内部命令的'-o functrace'选项(这种情况使所有的函数都继承'DEBUG'
和'RETURN'陷阱), 来使'DEBUG'和'RETURN'被继承. 关于'trap'内部命令详细内容,
*参见 4.1 Bourne Shell内部命令::.
                                                                                                                           
    如果内部命令'return'出现在函数中, 函数在此处结束, 并且执行流在函数调用的
下一条命令处继续.  在执行流继续前, 和'RETURN'陷阱相关联的任意命令都会被执行.
函数结束后, 位置参数和特殊参数'#'的值被还原为在该函数执行前它们所拥有的值.
如果给'return'一个数值型变元, 则该变元被当作函数的返回状态. 否则, 函数的返回
状态是'return'前最后一个被执行的命令的退出状态.
                                                                                                                           
    可以用内部命令'local'声明函数的局部变量. 这些变量只在函数内部以及函数所
调用的命令中可见.
                                                                                                                           
    可以用内部命令'declare'或'typeset'的'-f'选项显示出函数的名称和定义(*参见
4.2 Bourne Shell内部命令::). 'declare'或'typeset'的'-F'选项仅列出函数名称
(如果启用了shell的'extdebug'选项那么函数所在的源文件和行号也会被列出). 函数
可以用内部命令'export'的'-f'选项来被导出到子shell中, 这样子shell就自动有了
它们的定义. 注意, 如果函数名和变量名相同, 则会造成函数传递给它孩子的环境中
出现项目重名. 所以务必小心这可能导致的问题 .
                                                                                                                           
    函数可以递归, 递归调用的层次没有限制.
                                                                                                                           
3.4 Shell 参数
==============
                                                                                                                           
    参数是可以储存值的实体(entity).  一个参数可以是一个'名字', 一个数字,
或下面描述的特殊字符之一. 变量是用'名字'表示的参数. 一个变量有一个值及0个
或多个属性. 变量的属性可以用内部命令'declare'来指定(关于declare的描述,
*参见 4.2 Bash内部变量::).
                                                                                                                           
    对参数赋值后就称参数被"设置"了. null字符串也是一个可用的值. 当变量被
"设置"之后, 可以通过使用内部命令'unset'来"重置"变量.
                                                                                                                           
    变量可以通过以下形式的语句来赋值:
        NAME=[VALUE]
    如果VALUE未指定, 则变量NAME被赋予null字符串. 所有的VALUE都要经过波浪
号扩展, 参数和变量扩展, 命令替换, 算术扩展, 以及引用去除(详细说明见下文).
如果一个变量的'integer'属性被设置, 则VALUE被当作一个算术表达式来求值, 即使
VALUE没有使用'$((...))'扩展(*参见 3.5.5 算术扩展::). VALUE不进行单词分割,
但下面介绍的'$@'除外. 同时VALUE也不进行文件名扩展. 上述赋值语句同样可以
作为参数出现在'alias', 'declare', 'typeset', 'export', 'readonly'及'local'
等内部命令中.
                                                                                                                           
    在用赋值语句给shell变量或数组索引(*参见 6.7 数组::)赋值这样的情境下,
操作符'+='可被用来附加或累加变量的原有值. 当'+='应用于已设置'integer'属性
的变量时, VALUE被视作算术表达式求值并累加至变量的当前值上. 当'+='应用于数组
变量时(使用复合赋值, *参见 6.7 数组::), 该数组变量没有被"重置"(使用'='则
"重置"变量), 而是新值在数组最大索引加1的地方被附加到了数组上. 当'+='应用于
字符串变量时, VALUE被求值并添加到变量的字符串后.
                                                                                                                           
3.4.1 位置参数
--------------
                                                                                                                           
    一个位置参数是用一个或多个数字表示的参数, 但'0'除外. 在shell被调用时,
位置参数由shell的变元赋值, 也可以使用'set'内部命令对位置参数重新赋值. 援引
位置参数'N'可以用'${N}'的形式, 当'N'仅包含一个数字时, 也可以简化为'$N'.
位置参数不能用赋值语句进行赋值, 'set'和'shift'内部命令可以对位置参数进行
设置或重置(*参见 4 Shell内部命令::). 当一个shell函数被执行时(*参见 3.3 Shell
函数::), 位置参数会被临时性地替换.
                                                                                                                           
    当包含了多于一个数字的位置参数被扩展时, 必须用大括号括住该位置参数.
                                                                                                                           
3.4.2 特殊参数
--------------
                                                                                                                           
    Shell会特殊对待某些参数. 这些参数只能被援引, 不能被赋值.
                                                                                                                           
'*'
    从1开始, 扩展为位置参数. 当扩展发生在双引号内时, 它扩展为一个单一的单词,
    该单词包含每个位置参数, 相邻位置参数由'IFS'特殊变量的值的第一个字符分隔.
    就是说, '"$*"'会等价于'"$1C$2C..."', 其中'C'是'IFS'变量的值的第一个字符.
    如果'IFS'没有设置, 则位置参数用空白符间隔. 如果'IFS'为空, 则位置参数相互
    连接而不用任何间隔.
                                                                                                                           
'@'
    从1开始, 扩展为位置参数. 当扩展发生在双引号内时, 每个参数扩展为一个独立
    的单词. 就是说, '"$@"'等价于'"$1" "$2" ...'. 如果扩展发生在一个单词之内,
    则第一个参数的扩展结果将与原单词首部衔接, 最后一个参数的扩展结果将于原
    单词尾部衔接. 如果没有位置参数, '"@"'和'$@'不扩展成任何东西(即它们被删
    去).
                                                                                                                           
'#'
    扩展成位置参数的数目的十进制形式.
                                                                                                                           
'?'
    扩展成最近一个在前台执行的管道线的退出状态.
                                                                                                                           
'-'
    (连字符). 扩展成执行时的当前选项标志, 一般由'set'内部命令设置, 或由
    shell自己设置(如果'-i'选项).
                                                                                                                           
'$'
    扩展为shell的进程号. 在'()'子shell内, 它扩展为调用者shell的进程号, 而
    不是子shell.
                                                                                                                           
'!'
    扩展成最近一个在后台执行(异步地)的命令的进程号.
                                                                                                                           
'0'
    (零). 扩展为shell或shell脚本的名字. 该参数在shell初始化的时候被设置.
    如果shell被调用时以一个包含命令的文件(*参见 3.8 Shell脚本::)作为它的
    参数, 那么'$0'被设置成该文件的名称. 如果shell被启动时以'-c'作为其选项
    (*参见 6.1 运行Bash::), 那么'$0'被设置为要被执行的字符串之后的第一个
    变元, 如果它存在的话. 除以上情况外, '$0'被设置为用来调用Bash的文件名,
    而该文件名由变元0给出.
                                                                                                                           
'_'
    (下划线).
    At shell startup, set to the absolute pathname
    used to invoke the shell or shell script being executed as passed
    in the environment or argument list.  Subsequently, expands to the
    last argument to the previous command, after expansion.  Also set
    to the full pathname used to invoke each command executed and
    placed in the environment exported to that command.  When checking
    mail, this parameter holds the name of the mail file.
    [译注: 暂时有些头疼, 改天再说...]
                                                                                                                           

                                                                                                                          

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值