Shell 符号展开

shell中有7中展开。展开的顺序是:大括号展开;波浪展开、参数和变量展开、算术展开和命令替换(以从左到右的方式完成);分词;和文件名扩展。

在支持它的系统上,还有一种额外的扩展:进程替换。这与波浪线、参数、变量、算术展开和命令替换同时执行。

在执行这些扩展之后,原始单词中的引号字符将被删除,除非它们本身被引号括起来(引号删除)。

只有大括号展开、分词和文件名展开才能增加展开的单词数;其他扩展将单个单词扩展为单个单词。唯一的例外是$ @和$ ∗ 以 及 *以及 {name[@]}和${name[*]}(见数组)的扩展。

大括号展开

大括号展开是一种可以生成任意字符串的机制。展开大括号的模式采用可选的前缀,后接一系列逗号分隔的字符串或一对大括号之间的序列表达式,后接可选的后缀。前缀与大括号中包含的每个字符串组合,然后将后缀附加到每个结果字符串,从左到右展开。

大括号展开可以嵌套。每个扩展字符串的结果都没有排序;从左到右的顺序保持不变。例如:

echo a{
   d,c,b}e
ade ace abe

序列表达式的形式为

{x…y[…Incr]}

其中x和y是整数或单个字符,Incr是可选的增量,是一个整数。当提供整数时,表达式扩展为x和y之间的每个数字(包括x和y)。

echo {
   1..10}
1 2 3 4 5 6 7 9 10

提供的整数可以加上’ 0 '前缀,以强制每个项具有相同的宽度。当x或y以0开头时,shell会试图强制所有生成的术语包含相同数量的数字,必要时还会进行零填充。

echo {
   01..10} 
01 02 03 04 05 06 07 08 09 10

echo {
   0001..10} 
0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 

当提供字符时,表达式使用默认的C语言环境,按字典顺序展开到x和y之间的每个字符(含)。

echo {
   a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

注意 :x和y必须是相同的类型。当提供增量时,它被用作每个项之间的差值。默认的增量是1或-1。

echo {
   z..a..-1}
z y x w v u t s r q p o n m l k j i h g f e d c b a
echo {
   1..10..2} 
1 3 5 7 9 

大括号展开在任何其他展开之前执行,任何其他展开的特殊字符都保留在结果中。它是严格的文本。Bash不会对展开上下文或大括号之间的文本应用任何语法解释。

正确格式的大括号展开必须包含不带引号的前括号和后括号,以及至少一个不带引号的逗号或有效的序列表达式。任何不正确形成的大括号展开都保持不变。

一个{或’,‘可以用反斜杠括起来,以防止被认为是大括号表达式的一部分。为了避免与参数展开冲突,字符串’ ${‘被认为不符合大括号展开的条件,并禁止大括号展开,直到结束的’}’。

当要生成的字符串的公共前缀比上面的例子中要长时,这个结构通常被用作一种简写:

mkdir  -p /shelldir/{
   test,test1,test2}
或者
chown root /usr/{
   ucb/{
   ex,edit},lib/{
   ex?.?*,how_ex}}

波浪线扩展

如果一个单词以未加引号的斜杠字符(’ ~ ')开头,则第一个未加引号的斜杠之前的所有字符(如果没有加引号的斜杠,则所有字符)都被视为波浪前缀。如果波浪号前缀中的字符都没有被引用,那么波浪号后面的波浪号前缀中的字符将被视为可能的登录名。如果这个登录名是空字符串,则用shell变量HOME的值替换波浪号。如果没有设置HOME,则替换执行shell的用户的HOME目录。否则,波浪前缀将被替换为与指定登录名关联的主目录。

echo ~
/root

echo ~/
/root/

如果波浪前缀是’ ~+ ',则shell变量pwd的值将替换波浪前缀。

echo ~+
等价于
pwd

如果波浪符号前缀是’ ~- ',则shell变量oldpwd的值(如果它被设置了)将被替换。

ehco ~-
退回到上次目录

如果在波浪号前缀中,波浪号后面的字符由数字N组成,可选的前缀是’ + ‘或’ - ',波浪号前缀将被替换为目录堆栈中的相应元素,因为它会被内部调用的dirs显示,在波浪符号前缀中,波浪符号后面的字符作为参数(参见目录堆栈)。如果波浪线前缀(无波浪线)由一个没有“+”或“-”前导的数字组成,则假定为“+”。

e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久醉绕心弦,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值