`
xitong
  • 浏览: 6188757 次
文章分类
社区版块
存档分类
最新评论

bash参考手册之三(基本的Shell特性)续五

 
阅读更多

3.5 Shell扩展


在命令被分解后,扩展在命令行上执行。有执行7种类型的扩展要执行:

大括号扩展
波浪线扩展
参数和变量扩展
命令替换
算术扩展
单词分割
文件名扩展
•大括号扩展:扩展大括号内的表达式。
•波浪线扩展:扩展〜字符。
•shell参数扩展Bash扩展变量为值的方法。
命令替换:使用一个命令的输出作为参数。
•算术扩展:在shell扩展中如何使用算术计算。
•进程替换从命令读取和向命令写入的方法。
单词分割:把扩展的结果分割成单独的参数。
•文件名扩展:指定文件名匹配模式的简写。
引号移除:如何以及何时从单词中移除引号字符。
扩展的顺序是:大括号扩展,波浪线扩展,参数,变量和算术扩展和命令替换(由左到右的方式进行),单词分割,文件名扩展。

有一个额外的扩展——进程替换,在能够支持它的系统上使用。它和参数,变量,和算术扩展和命令替换同时执行。

仅有大括号扩展,单词分割,文件名扩展可以改变的扩展的单词数目,其他扩展把一个单一单词扩展成一个单一单词。唯一的例外是“$ @”(见特殊参数)和“$ {name[@]}”(请参阅阵列)的扩展。

引号扩展在所有扩展完成后执行(见引号移除)。


3.5.1 大括号扩展
大括号扩展是一个产生任意字符串的机制。这个机制和文件名扩展(见文件名扩展)相似,但生成的文件名必须不存在。被大括号扩展的模式一般是这种形式,一个可选的preamble(序言),后跟位于一对大括号之间的一系列以逗号分隔的字符串或一个序列表达,后跟一个可选的postscript(附言)。序言将被作为包含在大括号中的每个字符串的前缀,附言被附加到每个生成的字符串后边,扩展从左到右执行。
括号扩展可以嵌套。被扩展结果中的字符串是没有排序的,从左至右的顺序被保留。例如,
bash$ echo a{d,c,b}e
ade ace abe
序列表达式采取{x..y[..incr]}的形式,其中xy是整数或单个的字符,incr是可选的增量,是一个整数。当序列是整数时,该表达式扩展为x和y之间的数字,包括xy。可以在整数前面加上'0',以强制每个段都具有相同的宽度。当x或y以零开头时,shell试图强制所有产生的字段包含相同的位数,必要填充时零。当序列是字符串时,表达式扩展为x和y之间的字符,包括xy。需要注意的是,xy必须是相同类型。如果指定增量时,该增量被用于每个字段之间的差值。默认的增量根据情况是1或-1。
大括号扩展在任何其他扩展之前执行,在结果中保留对其他扩展具有特殊含义的字符。它是严格按照字面扩展的。 Bash不对扩展内容或者大括号之间的文本进行任何句法翻译。为了避免和参数扩展冲突,字符串'$ {'不被视为大括号扩展。
一个正确形式的大括号扩展,必须包含不带引号的左右大括号,以及至少一个的不带引号的逗号,或一个有效的序列表达式。任何不正确的大括号扩展将保持不变。
{或者','可以用引号包含并加上反斜杠,以防止其被认为是一个大括号表达式。为了避免和参数扩展冲突,字符串'$ {'不被视为大括号扩展。
当要生成的字符串的公共前缀的长度比在上面的例子中的长时,常用此结构来缩短命令的长度:
mkdir /usr/local/src/bash/{old,new,dist,bugs}

chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}

3.5.2 波浪线扩展

如果一个单词以未被引号包含的波形符(“~”)开头,那么,从开始到第一个没有引号包含的斜杠(或所有字符,如果没有引号包含的斜杠)被认为是一个 tilde-prefix(波浪线前缀)。如果波浪线前缀中的字符没有被引号包括,则波浪线前缀中波浪线后的字符被视为一个login name(登录名)。如果该登录名是空字符串,波浪线被替换为shell变量HOME的值。如果HOME没被设置,则它被替换为执行当前shell的用户的主目录。否则,波浪线前缀将被指定的登录名的主目录替换。
如果波浪线前缀是'~+',shell变量PWD的值将取代波浪线前缀。如果波浪线前缀是' ~-',将被替换为shell变量OLDPWD的值。
如果波浪线前缀中的波浪号后面的字符组成一个数字N,并由'+'或' - '前缀,则波浪线前缀被替换为目录栈中的相应元素,如同使用内建命令dirs,并且命令参数就是上述波浪线前缀中的波浪号后面的字符(见目录堆栈)。如果波浪线前缀,除了波浪线外,由一个前边没有加上一个'+'或' - '的数字组成的话,则假定是带'+'的。
如果登录名是无效的,或波浪线扩展失败,这个单词保持不变。
任何后跟':'或'='的变量赋值,将检查是否是不带括号的波浪线扩展。在这些情况下,也进行波浪线扩展。因此,给PATHMAILPATH,和CDPATH赋值时,可以使用带波浪线的文件名,shell会把扩展后的值赋给这些变量。
下表显示了bash如何对待不带括号的波浪线前缀:
~
$HOME的值
~/foo
$HOME/foo
~fred/foo
用户fred的主目录的foo子目录
~+/foo
$PWD/foo
~-/foo
${OLDPWD-'~-'}/foo
~N
将显示一个'dirs +N'命令的结果字符串
~+N
将显示一个'dirs +N'命令的结果字符串
~-N
将显示一个'dirs -N'命令的结果字符串





原文链接:http://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics