折腾

everything about EP (Engineering Productivity)
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

回想一下,断断续续在工作中写过很多bash脚本了,但一直有一个遗憾,就是未曾系统的学习过bash。能写跟能写的好绝对不是一码事,于是下决心把《高级Bash脚本编程指南》这本书主要部分都仔细读一遍,力争bash编程水平能有所进步,在这里记录一些简略的笔记,用于以后复习,主要会包括一些要点和疑惑解释。

第一部分热身略去了,毕竟不是完全没写过bash的人。。。

第二部分:基础

3.特殊字符

#

注释

命令分隔符,可以在同一行上写两个或两个以上的命令

;;

终止case选项

.

1)相当于source命令,将source的文件中代码引入并执行,source data-file相当于. datafile

2)作为文件名的一部分,如果放在文件名开头表示隐藏文件。作为目录相对路径,一个点表示当前工作路径,两个点表示上一级路径

3)正则表达式中,用来匹配任何的单个字符

"

部分引用。会阻止解释大部分特殊字符转义,但$,`(后置引用),和\(转义符)还是除外。还可以阻止单词分割,如果参数被双引号括起来,那么即使参数中有空白,也不会被分割开

'

全引用。会阻止解释所有特殊字符。单引号包含的字符串中不可能显示一个单引号自身,$也失去变量引用的作用

,

逗号,连接了一系列算数运算,所有的内容都会执行,但只有最后一项被返回,类似C语言

\

转义字符

/

文件名路径分割符,除法算数操作符

`

命令替换。可以将命令的输出赋值到一个变量当中去

:

1)空命令。是bash的一个内建命令,退出码是true(0)。等价于NOP,也可以被认为与shell的内建命令true作用相同

if condition
then : # 什么都不做,引出分支.
else

2)占位符。二元命令或者here document中

3)变量扩展和子串替换

4)在$PATH中做分隔符

!

1)取反操作符。反转命令的退出码结果,反转测试操作符的意义,

2)在命令行模式下,反转bash的历史机制,但在脚本中历史机制是被禁止的

*

1)通配符

2)正则表达式中匹配任意个数的字符

3)在算数操作符上下文中,表示乘法运算

4)**表示幂运算

?

1)测试操作符,在一个特定表达式中,?用来测试一个条件的结果

2)在双括号结构中,C语言的三元操作符,如(( t = a<45?7:11 ))

3)在参数替换表达式中,测试一个变量是否被set了,如${USER?}

4)通配符,匹配单个字符的通配符,在正则表达式中表示一个字符

$

1)变量替换。

2)行结束符,在正则表达式中

${}

参数替换

$*,$@

位置参数

“$*”:将所有参数一起作为一个word

“$@”:把每个参数单独看做一个word

  $*:不加双引号的,将每个参数单独看做一个word

$?

退出状态码变量

$$

进程id变量保存了它所在脚本的进程id

()

1)创建一个子shell运行()中的命令

2)初始化数组,如Array=(element1 element2 element3)

{}

1)大括号扩展,如cat {file1,file2,file3} > combined_file

2)创建一个匿名函数

{} \;

路径名. 一般都在find命令中使用. 这不是一个shell内建命令.";"用来结束find命令序列的-exec选项. 它需要被保护以防止被shell所解释.

find -exec COMMAND \; 在每一个find匹配到的文件执行COMMAND命令。命令序列以;结束。如果COMMAND中包含{}, 那么find命令将会用所有匹配文件的路径名来替换"{}".

例如:find ~/ -name 'core*' -exec rm {} \; #从用户的 home 目录中删除所有的 core dump文件

[ ]

1)条件测试。与内建命令test等价

2)数组元素

3)正则表达式中,描述字符范围

[[ ]]

测试。(shell关键字)。[[ ]]结构比[ ]结构更加通用. 这是一个扩展的test命令, 是从ksh88中引进的。

在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割, 但是会发生参数扩展和命
令替换.

使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,
&&, ||, <, 和> 操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中
的话, 会报错

(( ))

整数扩展。扩展并计算在(( ))中的整数表达式。双圆括号结构也被认为是在Bash中使用C语言风格变量操作的一种处理机制.

例如:

(( a = 23 )) # C语言风格的变量赋值, "="两边允许有空格.

(( a++ )) # C语言风格的后置自加.

> &> >& >> < <>

1)重定向。

例如:

command &>filename 重定向command的stdout和stderr到filename中

command >&2 重定向command的stdout到stderr中

[i]<>filename 打开文件filename用来读写, 并且分配文件描述符i给这个文件. 如果filename不
存在, 这个文件将会被创建

2)进程替换。(command)>    <(command) #这部分不好理解,后续深入研究

3)字符串比较操作,整数比较操作(在双括号中使用)

<<

用在here document中的重定向 #这部分单独研究here document时再分析

<<<

用在here string中的重定向.

|

管道. 分析前边命令的输出, 并将输出作为后边命令的输入

\<, \>

正则表达式中的单词边界.例如:grep '\<the\>' textfile,比配单词the,不会匹配them等

>|

强制重定向

||

或逻辑操作

&

后台运行命令

&&

与逻辑操作

-

1)选项, 前缀

2)用于重定向stdin或stdout,例如grep Linux file1 | diff file2 -

3)先前的工作目录. cd -将会回到先前的工作目录

4)减号

=

1)等号

2)字符串比较

+

1)加号

2)在另一种上下文环境中, +也是一种正则表达式操作

3)某些命令内建命令使用+来打开特定的选项, 用-来禁用这些特定的选项

%

1)取模

2)在不同的上下文中, %也是一种模式匹配操作

${var%Pattern}, ${var%%Pattern}

从变量$var的结尾删除最短或最长匹配$Pattern的子串

~

home目录

~+

当前工作目录. 相当于$PWD内部变量

~-

先前的工作目录. 相当于$OLDPWD内部变量

=~

正则表达式匹配。在双中括号测试表达式中的应用

例如:

variable="This is a fine mess."

if [[ "$variable" =~ "T*fin*es*" ]]

# 在[[ 双中括号 ]]中使用=~操作符进行正则匹配

^

行首。正则表达式中

  

控制字符

Ctl-B

退格(非破坏性的), 就是退格但是不删掉前面的字符

Ctl-C

break. 终结一个前台作业

Ctl-D

从一个shell中登出(与exit很相像)

Ctl-G

"哔" (beep). 在一些老式的打字机终端上, 它会响一下铃

Ctl-H

"退格"(破坏性的), 就是在退格之后, 还要删掉前边的字符

Ctl-I

水平制表符

Ctl-J

重起一行(换一行并到行首)

Ctl-K

垂直制表符

Ctl-L

清屏(清除终端的屏幕显示). 在终端中, 与clear命令的效果相同

Ctl-M

回车

Ctl-Q

在一个终端中恢复stdin

Ctl-S

在一个终端中冻结stdin

Ctl-U

删除光标到行首的所有字符

Ctl-V

当输入字符时, Ctl-V允许插入控制字符

Ctl-W

当在控制台或一个xterm窗口敲入文本时, Ctl-W将会删除当前光标到左边最近一个空格间的全部字符.

Ctl-Z

暂停前台作业

空白

用来分隔函数, 命令或变量。空白包含空格, tab, 空行或者是它们之间任意的组合体。特殊变量$IFS用来做一些输入命令的分隔符, 默认情况下是空白

其他注意事项

在pipe中的一个大括号中的代码段可能运行在一个 子shell中. 例如:ls | { read firstline; read secondline; }

一个换行符("重起一行")也被认为是空白符. 这也就解释了为什么一个只包含换行符的空行也被认为是空白