bash之参数和变量扩展(parameter and variable expansion)

来源:互联网 发布:万方经济统计数据库 编辑:程序博客网 时间:2024/06/05 23:37

写在前面

如果你问我bash的这么多扩展哪个功能最强大,那我会毫不犹豫地告诉你,当然是参数扩展啦~

为什么说参数扩展功能强大呢?那是因为通过参数扩展功能,我们可以完成很多意想不到的功能,例如可以完成参数值的删除、取代以及替换等功能~


SHELL参数以及参数的分类

开始讲述参数扩展之前,我们先要了解什么是shell的参数,以及引用参数的不同方法。

其实在shell编程中,参数(parameter)是个大概念,也是个笼统的概念,在bash手册中对参数的定义只是一句话:

A parameter is an entity that stores values. 

意思是说在shell中参数是个实体(entity),这个实体中存储着各式各样的值(values)。

紧接着提到:

It can be a name, a number, or one of the special characters listed below under Special Parameters.

这句话其实是告诉我们,可以通过三类方式来引用参数,从而得到参数中存储的值。根据引用方式的不同,可以将参数分为三类,归纳如下:

(1)通过名称(name)来引用参数,这样的参数我们称之为变量(variables )。一个变量拥有自己的值和诸多属性,属性可以通过declare来设定,可以通过unset来取消一个变量。

(2)通过数字(number)来引用参数,这样的参数我们称之为位置参数(Positional Parameters)。位置参数在脚本被调用时自动初始化为传递给脚本的参数。脚本中调用函数时,位置参数会暂时替换成传递给函数的参数。我们可以使用set命令来改变位置参数的值,但是不能试图通过赋值语句来改变位置参数的值。

(3)最后还有一类参数,被称之为特殊参数(Special Parameters)。特殊在哪里? 特殊在我们只能通过shell内部预定义的特殊符号来引用它们,并且我们只能引用,不能试图通过赋值语句来重新赋值。预定义的特殊符号包括:*  @  $  ?  !  -  $  0


什么是参数扩展呢?

讲白了,所谓参数扩展就是通过符号$获得参数中存储的值。只不过呢,在获得最终的结果之前,允许我们对参数以及参数值做很多操作,例如博文一开始就提到的对参数值进行删除、取代以及替换等操作~

本篇博文就是详细讨论参数扩展过程中我们可以进行的诸多操作。


最简单的形式

参数扩展最简单直接的形式如下:

$parameter

或者

${parameter}

个人倾向于后者,第一有花括号一看就知道是参数扩展,其次可以根据需要在右花括号后头追加字符(串),否则shell会认为是参数的一部分。举个小例子就知道了,如下:

[09:49:23@astrol:~]$ WORD=car[09:49:25@astrol:~]$ echo "The plural of $WORD is most likely $WORDs"The plural of car is most likely[09:49:27@astrol:~]$ echo "The plural of $WORD is most likely ${WORD}s"The plural of car is most likely cars

可以看到不加花括号的话,shell认为WORDs是参数,然而我们并没有设置过这个参数,因此扩展结果为空。

需要注意的是,在bash中引用位置参数时,大于第9个参数时,两位的数字要求必须要在花括号内。例如:#{10}

另外,后文介绍的各种操作都是需要在花括号内进行的。


间接扩展(indirect expansion)

间接扩展也被很多人称为间接引用。如果熟悉C/C++的话,可以简单的把间接扩展理解成指针变量。

删除


子串


查找和替换

${parameter/pattern/string}


参考链接:

《BASH: Parameter expansion》(需梯子)

《shell变量详解》

《Linux 技巧: Bash 参数和参数扩展》《Bash parameters and parameter expansions》

《Shell参数扩展》

《Linux Shell参数扩展(Parameter Expansion)》

《Bash parameters and parameter expansions》

《An introduction to parameter expansion in Bash》

原创粉丝点击