bash shell的扩展,指shell在分析输入命令时的一种将命令展开的操作。 有7种扩展方式。参考一下man bash的扩展页:
view plain
扩展(EXPANSION)
命令行的扩展是在拆分成词之后进行的。有七种类型的扩展: brace expansion(花括号扩展), tilde expan‐
sion(波浪线扩展), parameter and variable expansion(参数和变量扩展), command substi‐
tution(命令替换), arithmetic expansion(算术扩展), word splitting(词的拆分), 和 path‐
name expansion(路径扩展).
扩展的顺序是:brace expansion, tilde expansion, parameter, variable 和 arith‐
metic expansion 还有 command substitution (按照从左到右的顺序), word splitting,
最后是 pathname expansion.
还有一种附加的扩展:process subtitution (进程替换) 只有在支持它 的系统中有效。
只有 brace expansion, word splitting, 和 pathname expansion
在扩展前后的词数会发生改变;其他扩展总是将一个词扩展为一个词。 唯一的例外是上面提到的 "$@" 和 "${name[@]}" (参见
PARAMETERS参数)。
Brace Expansion
Brace expansion 是一种可能产生任意字符串的机制。这种机制类似于 pathname expansion,
但是并不需要存在相应的文件。 花括号扩展的模式是一个可选的 preamble(前导字符),
后面跟着一系列逗号分隔的字符串,包含在一对花括号中, 再后面是一个可选的 postscript(附言)。
前导被添加到花括号中的每个字符串前面,附言被附加到每个结果字符串之后, 从左到右进行扩展。
花括号扩展可以嵌套。扩展字符串的结果没有排序;而是保留了从左到右的顺序。 例如, a{d,c,b}e 扩展为 `ade ace abe'。
花括号扩展是在任何其他扩展之前进行的,任何对其他扩展有特殊意义的字符 都保留在结果中。它是严格字面上的。 Bash
不会对扩展的上下文或花括号中的文本做任何语义上的解释。
正确的花括号扩展必须包含没有引用的左括号和右括号,以及至少一个没有 引用的逗号。任何不正确的表达式都不会被改变。可以用反斜杠来引用 { 或 ,
来阻止将它们识别为花括号表达式的一部分。 为了避免与参数扩展冲突,字符串 ${ 不被认为有效的组合。
这种结构通常用来简写字符串的公共前缀远比上例中为长的情况,例如:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
或者:
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
花括号扩展导致了与历史版本的 sh 的一点不兼容。在左括号或右括号作为词的一部分出现时, sh 不会对它们进行特殊处理,会在输出中保留它们。
Bash 将括号从花括号扩展结果的词中删除。例如,向 sh 输入 file{1,2} 会导致不变的输出。同样的输入在 bash
进行扩展之后,会输出 file1 file2 . 如果需要同 sh 严格地保持兼容,需要在启动 bash 的时候使用 +B 选项,或者使用
set 命令加上 +B 选项来禁用花括号扩展 (参见下面的 shell 内建命令(SHELL BUILTIN COMMANDS) 章节)。
大括号(花括号)扩展方式也有意思。
示例1:操作多个文件名有共同点的文件
zhouhh@zhh64:~/brace$ ls
bk
zhouhh@zhh64:~/brace$ touch file{source,target,info,readme}.txt
zhouhh@zhh64:~/brace$ ls
bk fileinfo.txt filereadme.txt filesource.txt filetarget.txt
zhouhh@zhh64:~/brace$ echo file{1,2,3,4}.txt
file1.txt file2.txt file3.txt file4.txt
zhouhh@zhh64:~/brace$ touch file{1,2,3,4}.txt
zhouhh@zhh64:~/brace$ ls
bk file1.txt file2.txt file3.txt file4.txt
示例2:一个命令将几个文件名有规律的文件转移到一个目录
zhouhh@zhh64:~/brace$ ls bk
zhouhh@zhh64:~/brace$ mv file{1,2,3,4}.txt bk/.
zhouhh@zhh64:~/brace$ ls bk
file1.txt file2.txt file3.txt file4.txt
zhouhh@zhh64:~/brace$
示例3:备份
zhouhh@zhh64:~/brace$ touch mydata.log
zhouhh@zhh64:~/brace$ vi back.sh
zhouhh@zhh64:~/brace$ chmod +x back.sh
zhouhh@zhh64:~/brace$ cat back.sh
set -x #调试模式
bkdate=`date +%F` #日期
cp mydata{,$bkdate}.log #将log备份为带日期格式
zhouhh@zhh64:~/brace$ ls
back.sh bk mydata.log
zhouhh@zhh64:~/brace$ ./back.sh
+++ date +%F
++ bkdate=2010-06-10
++ cp mydata.log mydata2010-06-10.log
zhouhh@zhh64:~/brace$ ls
back.sh bk mydata2010-06-10.log mydata.log
示例4 处理多个有规律文件名
zhouhh@zhh64:~/brace$ echo /var/log/messages.{1..3}
/var/log/messages.1 /var/log/messages.2 /var/log/messages.3
zhouhh@zhh64:~/brace$ echo file{a..d}{1..3}.txt
filea1.txt filea2.txt filea3.txt fileb1.txt fileb2.txt fileb3.txt filec1.txt filec2.txt filec3.txt filed1.txt filed2.txt filed3.txt
示例5 for循环
zhouhh@zhh64:~/brace$ for i in {1..9..3}
> do
> echo $i
> done
1
4
7
分享到:
相关推荐
在Shell脚本编程中,大括号({})扮演着至关重要的角色,它们被广泛用于各种语法结构和操作。下面将详细介绍大括号在Shell中的主要用途。 1. **数组定义**:在Shell中,大括号用于定义数组。例如,创建一个包含三个...
本文将详细介绍 Shell 中各种括号的作用,包括小括号、双小括号、中括号、双中括号和大括号等。 一、小括号() 小括号的主要作用是用于命令组和命令替换。命令组的作用是将多个命令组合在一起,形成一个新的命令...
### Shell括号详解 #### 一、概述 Shell脚本是一种强有力的工具,它不仅能够帮助用户执行复杂的系统任务,还能实现自动化操作。在Shell脚本中,括号扮演着多种角色,包括变量处理、命令替换、流程控制以及数学运算...
### Shell脚本括号的用途...以上是对Shell脚本中括号使用的详细介绍,包括了小括号、中括号和大括号的各种应用场景及其特点。这些括号的不同用法使得Shell脚本具有强大的功能和灵活性,可以用来处理各种复杂的任务。
在Shell脚本编程中,括号有着特殊的意义和作用,主要分为五种类型:小括号()、双小括号(())、中括号([])、双中括号([[]])以及大括号({})。下面将详细介绍每一种括号的作用。 1. **小括号()** - 命令组:圆...
brackets-shell, 基于CEF3的括号应用 shell 概述这是用于括号的CEF3-based应用程序 shell 。请阅读括号 repo 中的主自述文件,了解关于括号的一般信息。如果你对这个 shell 感兴趣,请在 brackets-dev Google或者在...
* Shell 数组可以使用括号来定义 Shell echo 命令: * Shell echo 命令是指在 Shell 中输出字符串的命令 * Shell echo 命令可以使用 -n 选项来实现不换行 Shell printf 命令: * Shell printf 命令是指在 ...
Shell支持一维数组,数组下标从0开始,使用圆括号定义数组,并通过空格分隔各个元素。例如: ```shell array_name=(value0 value1 value2 value3) ``` 或者 ```shell array_name[0]=value0 array_name[1]=value1 ```...
4. **命令替换**:反引号(``)或`$( )`用于命令替换,它们会先执行括号内的命令,然后将结果替换为文本。 5. **通配符和正则表达式**:`*`、`?`等通配符用于匹配文件名,正则表达式则提供了更复杂的模式匹配功能。 ...
在Shell中,可以使用大括号`{}`来组合多个命令,使其在同一个Shell环境中依次执行。例如: ```shell { cmd1; cmd2; cmd3; } ``` 这种方式称为命令组,命令组中的命令实际上是在当前Shell环境中执行的。 当命令组...
14.大括号 ({} ) - 命令分组符号 大括号 ({} ) 用于命令的分组。 15.方括号 ([]) - 数组符号 方括号 ([]) 用于数组的表示。 16.圆括号 (() ) - 命令分组符号 圆括号 (() ) 用于命令的分组。 17.逻辑与 (&&) - ...
### Shell经典教程知识点总结 #### 一、Shell简介与学习目的 **Shell**是一种用于与计算机操作系统进行交互的命令行接口。本教程主要介绍的是**Bash(Bourne Again Shell)**,它是Linux中最常用的Shell之一。在...
Unix Shell是Unix系统中的命令解释器,它允许用户通过命令行与操作系统进行交互,同时也提供了编写脚本的能力,极大地提高了工作效率。这本书的第三版详细介绍了如何利用Shell编写高效、实用的脚本,对于理解和掌握...
【Shell十三问详解】 一、为何叫做 shell? Shell之所以得名,源于它作为操作系统内核(kernel)与用户之间的“外壳”(shell),提供了一种交互界面,使得用户...在Unix系统中,熟练掌握shell能极大地提高工作效率。
命令执行顺序章节则涉及了如何使用逻辑运算符&&和||以及括号()和花括号{}来将多个命令组合在一起,控制命令的执行顺序和条件。 第二部分专注于文本过滤技术,包括正则表达式介绍和grep命令家族。正则表达式章节中...
echo "this is the $numnd",这将不会输出"this is the 2nd",而是输出"this is the ",因为 Shell 会去搜索变量 numnd 的值,可以使用花括号来告诉 Shell 我们要打印的是 num 变量,例如:echo "this is the ${num...
Linux Shell 脚本 Linux Shell 脚本是一种为 Shell 编写的脚本程序。Shell 是一种命令语言,又是一种程序设计语言。Shell 脚本的主要作用是帮助用户更方便地使用 Linux 操作系统。 一、 Shell 介绍 Shell 是一个...