文章目录
BASH 中文文档
2.4 Shell扩展
有七种扩展:大括号扩展、波浪号扩展、参数和变量扩展、命令替换、算数扩展、单词拆分、文件名扩展
2.4.1 大括号扩展
echo a{d,c,b} = echo ad,ac,ab
mkdir /usr/local/src/bash/{old,new,dist,bugs}
格式:{x...y[增量]}
大括号不会识别字符串"&{"
2.4.2 波浪号扩展
以~开头
波浪号 | 描述 |
---|---|
~ | $HOME的值 |
~/foo | $HOME/foo |
~fred/foo | 用户fred主目录中的子目录foo,即$PWD/foo |
~+/foo | $PWD/foo |
~-/foo | ${OLDPWD - ‘- -’ /foo} |
~N | 命令dirs +N所显示的字符串 |
~+N | 命令dirs+N所显示的字符串 |
~-N | 命令dirs-N所显示的字符串 |
2.4.3 参数和变量扩展
以$开头
参数 | 描述 |
---|---|
${参数:-单词} | 参数没有设置或者为空就替换为单词;否则替换成参数值 |
${参数:=单词} | 参数没有设置或者为空就把单词赋给参数再替换参数的值 |
${参数:?单词} | 参数没有设置或者为空就把单词写到标准错误输出中 |
${参数:+单词} | 参数没有设置或者为空、,不进行任何替换;否则替换成单词 |
{ 参 数 : 偏 移 量 } < b r / > {参数:偏移量}<br /> {参数:偏移量}<br/>{参数:偏移量:长度} | 扩展为参数中从偏移量开始的不超过长度个字符,没指定长度就从偏移量开始的子字符串。(长度和偏移量都是算术表达式,又称子字符串扩展) 长度值要大于等于0 |
${!前缀*} | |
${!前缀@} |
2.4.4 命令替换
命令替换用命令的输出取代命令本身,,
格式为
$(命令)
或者
·命令·
2.4.5 算术扩展
算术扩展可以对算术表达式求值并替换成的求值的结果,,
格式为
$((表达式))
2.4.6 进程替换
管道
格式为
<(命令列表)
或者
>(命令列表)
2.4.6 单词拆分
shell会扫描参数扩展、命令替换和算术运算的结果。
2.4.7 文件名扩展
模式匹配
字符 | 描述 |
---|---|
* | 匹配任何字符串 |
? | 匹配单个字符 |
[…] | 匹配方括号中的任一字符 |
?(模式列表) | 与模式列表匹配零次或一次 |
*(模式列表) | 与模式列表匹配零次或多次 |
+(模式列表) | 与模式列表匹配一次或多次 |
@(模式列表) | 与模式列表中的模式之一匹配 |
!(模式列表) | 与模式列表中的任一模式之外的字符匹配 |
[:类别:]
类别 | 描述 |
---|---|
alnum | 匹配所有字母和数字 |
alpha | 匹配所有字母 |
ascii | 匹配所有(ASCLL)字符 |
blank | 匹配所有空白符 |
cntrl | 匹配所有控制字符(即ASCLL中的二十个字符) |
digit | 匹配所有的数字(0-9) |
graph | 匹配所有可显示字符(可打印字符中,空格和退格符不可显示) |
lower | 匹配所有小写字母 |
匹配可打印字符(非控制字符都可打印) | |
punct | 匹配所有标点符号 |
space | 匹配空格 |
upper | 匹配所有大写字母 |
word | 匹配单词里面的字符(大小写字母) |
xdigit | 匹配所有十六进制数字(0-9和A-F) |
2.5 重定向
重定向可以打开或关闭当前shell执行环境的文件
< >
把标准输出(文件描述符为1)和标准错误输出(文件描述符为2)重定向到文件目录列表中:
ls > 目录列表 2>&1
标准输出重定向到文件目录列表中,因为 标准输出被重定向到文件目录列表终止前,标准错误输出已经被复制到标准输出中了。
ls 2>&1 >目录列表
上述两个是相同的结果,但是比较推荐用第一种。。。
重定向时,会对以下文件进行处理:
/dev/fd/fd 如果fd是个有效的整数,则复制文件描述符fd
/dev/stdin 复制文件描述符0
/dev/stdout 复制文件描述符1
/dev/stderr 复制文件描述符2
/dec/tcp/主机名/端口号 如果主机名是个有效的主机名称或因特网地址,并且端口号是整数型的端口号或服务名称,Bash会试图打开一个到相应的套接字端口的TCP连接
/dev/udp/主机名/端口号 如果主机名是个有效的主机名称或因特网地址,并且端口号是整数型的端口号或服务名称,Bash会试图打开一个到相应的套接字端口的UDP连接
2.5.1 输入重定向
格式为
[n]<单词
2.5.2 输出重定向
格式为
[n]>[|]单词
2.5.3 输出重定向的追加
格式为
[n]>>单词
2.5.4 输出和错误输出重定向
格式为
&>单词
或者
>&单词
2.5.5 输出和错误输出重定向的追加
格式为
&>>单词
2.5.6 即插即用文本
格式为
<<[-]单词
即插即用文本
结束符
2.5.7 即插即用字符串
格式为
<<<单词
2.5.8 文件描述符的复制
重定向运算符(用来复制输入文件描述符)
[n]<&单词
输出
[n]>&单词
2.5.9 文件描述符的移动
重定向运算符(把文件描述符数字转移到文件描述符n上)
[n]<&数字-
输出
[n]>&数字-
2>&1
2.5.10 打开文件描述符以备读出和写入
重定向运算符
[n]<>单词
2.6 命令的执行
2.6.1 简单命令的扩展
- shell会从左到右进行下列扩展、赋值、重定向:
1.被分析器当作(在命令名称之前的)变量赋值和重定向的单词,将被保存下来以备后续处理
2.不是变量赋值和重定向的单词会被shell扩展,如果扩展以后还有单词,则其中的第一个会被当作命令的名称,剩余的当作该命令的参数。
3.进行前面所说的重定向
4.每个变量赋值语句中"="后面的文本在赋给变量之前会进行大括号扩展、参数扩展、命令替换、算术扩展、引用去除
2.6.2 命令的搜索和执行
- 命令拆分成单词后,执行下面的操作:
1.如果命令名中不含斜杠,shell试图找到它。如果有一个同名的shell函数,则执行该函数
2.如果这个名称不是函数,shell会在内部命令列表中搜索它。如果找到,则执行该内部命令
3.如果这个名称既不是函数名,也不是内部命令,并且不含斜杠,Bash会搜索$PATH中每个目录里面同名的可执行文件。
4.如果搜索成功,或者命令名中含有一个或多个斜杠,shell就会在独立的执行环境中执行这个命令。
5.如果因为文件格式和可执行文件不同导致,并且该文件不是一个目录的名称,它就会被当做一个shell脚本的方法执行
6.如果命令不是异步执行的,shell会等待它的结束并收集其返回状态
2.7 Shell脚本
Shell脚本是包含shell命令的文本文件。
Bash脚本的开头通常是#!/bin/bash