基本语法

echo

-n :取消echo输出文本末尾的回车符

-e:解释单双引号的特殊字符,否则默认直接输出

空格

空格和tab符被用于分割不同的参数,如有多个,也只识别成一个

分号

命令的结束符;

可以使一行多个命令

从左到右执行,前面的命令失败与否不影响第二个命令执行

&&和||

cmd1&&cmd2: 如果第一个cmd执行成功则运行第二个

cmd1||cmd2:如果第一个失败则运行第二个

type命令

判断命令为内置命令(shellbuiltin)还是外部程序(hashed)

-a参数:查看一个命令的所有定义;

  • 因为同一个命令可以有多个程序实现,内部的或者外部的

-t参数:返回一个命令的类型

  • alias

  • keyword

  • function

  • builtin

快捷键

Ctr+L:清屏

Ctr+C:中止命令

Shift+Pageup/down:上/下滚动

Ctr+U:从当前位置删除到行首

Ctr+K:从当前位置删除到行尾

Ctr+W:删除光标位置前一个单词

Ctr+D:关闭Shell对话

Tab:自动补全,双击获得全部备选项

模式拓展

Shopt命令

调节Bash行为的命令

  • shopt -s [opt]打开选项

  • shopt -u [opt]关闭选项

  • shopt [opt]查询打开或者关闭

参数;

  • dotglob : 意为”.”开头的文件,也即包括隐藏文件与否

  • nullglob : 让通配符匹配失败时返回空字符, 而非通配符对应字符串

  • failglob : 当匹配失败时,直接返回错误, 避免命令处理该字符串

  • extglob : 支持量词语法

  • nocaseglob : 让通配符不区分大小写

  • globstar : 支持 “**“拓展,可以匹配任意多级目录

波浪线拓展

自动拓展成当前用户主目录

~user拓展成当前用户主目录

  • ~foo: /home/foo

  • ~root: /root

~+: 拓展成当前目录,等于pwd

? 字符拓展

匹配任意单字符

可以多个连用

*字符拓展

匹配任意数量的任意字符

可以匹配零个字符

特殊用法

  • 匹配隐藏文件

  • 通配符: “.*“

  • 匹配子目录文件

  • *只能匹配当前目录

  • “*/“再加上通配符可以匹配子目录,有几层子目录就写几层

  • “**/“可以匹配零个或者多个子目录

方括号拓展

匹配[~]内包含的单个字符

\^!否定:

  • [!~]或者[\^~]都可以表示否定

  • 匹配不在方括号中的字符

“-“字符:

  • [start-end]型用法,匹配一个连续的区间

  • [a-z]:字母表

  • [0-9]:数字

  • 由于会造成误识别为链接用法, 需要匹配”-“时需要将其放到末尾或者开头

大括号拓展

拓展成括号内的所有值

  • 值可以没有,表示空

  • 值之间用逗号分隔

  • 逗号前后不能有空格,否则拓展失效

  • 不是文件拓展,不管文件存在与否都拓展成给定值

  • 优先级高,总是先被运行(相较于其他拓展

  • 可以嵌套拓展

    • {A{1,2},B{1,2}}
    • 等于A1 A2 B1 B2
  • {Start..End}

    • 与方括号类似,不过用”..”连接
  • {Start..End..Step}
    • 指定步长

变量拓展

“$“:取变量值

可以与前面的拓展连用,取多个变量值

子命令拓展

$(~): ~表示命令,该式将~的输出作为返回值

`~`:同样表示子命令

算术拓展

$((~)):将~拓展为整数运算

  • let 命令使赋值可以直接执行算术表达式

字符类

[[:class:]]

  • alnum : 字母和数字

  • alpha : 字母

  • blank : 空格和tab键

  • cntrl : ASCII 0-31的非打印字符

  • digit : 数字

  • graph : 字母,数字,标点

  • lower : 小写字母

  • upper : 大写字母

  • print : 32-127 的可打印字符

  • punct : 标点(除了字母,数字之外的可打印字符)

  • space : 空格,tab, ASCII 10-13(LF,VT,FF,CR)

  • xdigit : 16进制字符

拓展量词

?(~): 0,1

*(~): 0-infinity

+(~): 1-infinity

@(~): 1

!(~): 除外

引号和转义

转义符: 反斜杠\

特殊字符失效化:

表示不可打印字符

  • \a : alarm,响铃

  • \b: backspace, 退格

  • \n; 换行

  • \r: 回车

  • \t: table,制表符

特殊用法,命令分行

  • 本质上是转移 \n,使之被当作空格处理

引号’ or \”

同样有无效化特殊字符的作用, 在引号内的特殊字符被当作普通字符处理

双引号中,大部分字符失效

  • $

  • `

  • \

单引号中, 全部字符意义失效

双引号可以保存命令的输出格式

  • 如多个空格

here文档

输入多行字符串

格式

  • 起始: \<\< token

  • 结束: token

支持变量拓展,反斜杠拓展,不支持通配符拓展

  • 可以将\”\<<token",放在单引号中,可以使变量拓展失效>{=html}

here字符串

  • \<\<<string>{=html}

  • 将命令通过标准输入传递给命令

  • 等同于 echo string | command

  • 优点在于有的命令只能接受标准输入作为参数

# cat
# MD5sum

变量

环境变量

自带定义,已经定义好的

  • printenv

  • env

常见环境变量

  • BASHPID

  • BASH的进程ID

  • BASHOPTS

  • 当前shell的参数, 可以用`shopt`修改

  • DISPLAY

  • 图形环境的显示器名字

  • HOME

  • 用户主目录

  • HOST

  • 主机名称

  • IFS

  • 词分割符,默认空格

  • LANG

  • 字符集和语言编码

  • PATH

  • 目录列表,可执行程序的搜索路径,包含由冒号分开的目录列表

  • PS1

  • Shell提示符

  • PS2

  • 输入多行命令时,次shell提示符

  • PWD

  • 工作目录

  • RANDOM

  • 产生0~(2\^15-1)之间的一个随机整数

  • SHELL

  • shell的名字

  • SHELLOPTS

  • 启动当前shell的set命令参数

  • TERM

  • 终端类型名

  • UID

  • 用户ID编号

  • USER

  • 当前用户用户名

自定义变量

用户在当前shell中设立的变量,仅当前shell可用

set命令可查看所有自定义变量和环境变量和所有bash函数

创建变量

变量规则

  • 字母+数字+下划线

  • 以字母或者下划线开头

  • 没有空格或者标点符号

读取变量

  • $,或者${~}读取

  • 变量不存在则返回空字符

  • ${!varname}

  • 一个变量的值是另一个变量的名字

  • 该公式将其自动展开到最终值

删除变量

unset name

将变量值设为空

输出变量

exprot NAME

将一个变量设置为环境变量(对于本SHELL和随后创建的

可以同时进行赋值

子shell修改继承值,不影响父shell

特殊变量

$?: 上一个命令的退出码,返回为0则成功,否则失败

$$: 当前shell的进程ID

$_: 上一个命令的最后一个参数

$!: 最近的一个后台运行的进程的ID

$0: 当前shell的名称或者脚本名

$-: 当前shell的启动参数

$@和$# 参数值和参数数量

变量默认值

${varname : -word}

  • 如果varname存在且不为空,则返回word

${varname:=word}

  • 不存在时返回word并将该var设为word

${varname:+word}

  • 存在且不为空,返回word,否则空值

${varname: ?message}

  • 存在且不为空,则返回varvalue,否则打印出message,并中断脚本

Declare命令

声明变量,为变量设置限制

-i参数: 声明整数变量

  • 可以直接进行数学运算

  • 一个被解释为整数后,其他的变量自动解释

-x参数:等同于export

-r参数: 设置仅可读

  • 无法改变也不能`unset`

  • readonly 命令: 与declare -r等价

  • -f 变量为函数名

  • -p 打印所有只读变量

  • -a 生命的变量为数组

-u参数: 声明变量为大写字母,upper

-p参数:输出变量信息,print

-f参数: 输出当前环境所有函数,及其定义

-F参数: 同上,单不包括定义

字符串操作

字符串长度

$#{varname}

$#在脚本中表示脚本的参数个数,故大括号是必要的

子字符串

${varname:offset:length}

表示截取varname变量中offset位置开始的length长度子串

  • 忽略length则取到末尾

只能操作变量,不能操作字符串

若offset可以为负值, 同样表示对应位置

  • 负号和冒号间必须有空格

  • 否则会和设置变量默认值的语法混淆

  • 此时length可以为负值,表示排除从末尾开始的length个字符

搜索与替换

头部识别(从开头开始匹配)

  • ${var#pattern}

  • 删除最短匹配部分,返回剩余

  • ${var##pattern}

  • 删除最长匹配部分,返回剩余

  • ${var/#pattern/string}

  • 替换匹配部分

尾部识别

  • ${var%pattern}

  • 删除最短匹配部分,返回剩余

  • ${var\%\%pattern}

  • 删除最长匹配部分,返回剩余

  • ${var/%pattern/string}

  • 替换匹配部分

任意位置识别

  • ${var/pattern/string}

  • 最长匹配部分,仅替换第一个匹配

  • ${var//pattern/string}

  • 最长匹配部分,但替换所有最长匹配

改变大小写

${varname\^\^}

  • 转为大写

${varname,,}

  • 转为小写

算术运算

算术表达式

((~)); 整数的算术运算

使用$?可以获取算术表达式运行情况

  • 算数结果为0就算执行失败,为1

  • 否则就算成功,为0

支持的运算符

  • +,-,*

  • /: 整除

  • %: 余数

  • **指数

  • ++:自增

  • —自减

表达式中可以引用变量,且不需要加$取值符号

若变量为字符串则将其作为空值处理, 为0

也可以使用

  • let

  • let x=2+3

  • expr

  • expr $foo+3

进制

number: 十进制

0number: 八进制

0xnumber: 十六进制

base#number: base进制

二进制操作

\<\</>> digit,位左移/右移运算

  • 乘2**digit

&: 二元操作符,对两个数字的所有位执行AND操作

|: 与操作

\^: 异或操作

逻辑运算

\<

>

\<=

>=

==

!=

&&:与

||:或

!:否

expr?expr1:expr2

  • 若真则1,若假则2

赋值

+=

-=

*=

/=

%=

\<\<=

>>=

&=

|=

求值运算

((expr1 , expr2))

执行两个表达式,返回后面一个的值

行操作

快捷键else

Ctrl + j:等同于回车键(LINEFEED)。

Ctrl + m:等同于回车键(CARRIAGE RETURN)。

Ctrl + o:等同于回车键,并展示操作历史的下一个命令。

Ctrl + v:将下一个输入的特殊字符变成字面量,比如回车变成\^M。

Ctrl + [:等同于 ESC。

Alt + .:插入上一个命令的最后一个词。

Alt + _:等同于Alt + .。

快捷键模式

Vi快捷键

emacs快捷键

set -o vi/emacs 设置

光标移动

Ctrl+A

  • 行首

Ctrl+B

  • 左移一个字符

Ctrl+E

  • 行尾

Ctrl+f

  • 右移一个字符

Alt+f

  • 单词词尾

Alt+b

  • 单词词首

Ctrl+L

  • 清屏

编辑

Ctrl+d

  • 删除光标所在位置字符

Ctrl+W

  • 删除删除光标前的字符

Ctrl+t

  • 光标位置的字符与前面一位的字符交换位置

Alt+t

  • 光标位置的词与前面一位的词交换位置

Alt+I

  • 从光标位置到词尾转为小写

Alt+u

  • 将光标位置至词尾转为大写

复制粘贴

Ctrl+k

  • 剪切光标位置到行尾的文本

Ctrl+u

  • 剪切光标位置到行首的文本

Alt+d

  • 剪切光标位置到词尾的文本

Alt+Backspace

  • 剪切光标位置到词首的文本

Ctrl+y

  • 粘贴

自动补全

Tab: 自动补全

Alt+?: 列出可能的补全

Alt+/:文件路径补全

Alt+I:命令补全

Alt+~:用户名补全

Alt+$: 变量名补全

Alt+@: 主机名补全

Alt+*:一次性插入所有可能的补全

Alt+tab: 尝试用以前的命令的进行补全

操作历史

$HISTFILE: 指向/home/me/.bash_history

history: 直接输出所有历史,默认储存500条命令

Ctrl+r : 搜索操作历史,选择以前使用过的命令

  • !~: 表示查找以~开头的、最近的命令

  • 只会匹配命令,不能匹配参数

history环境变量设置

  • export HISTTIMEFORMAT = ‘%F %T’

  • 保留执行命令的时间戳

  • export HISTSIZE=num

  • 设置保存历史操作记录数

  • export HISTIGNORE=”com1:com2:com3”

  • 设置不保留某些命令的历史

history | grep pattern

  • 模式搜搜

!number:直接执行对应索引的命令

history -c 清除搜索历史

快捷键

  • Ctrl+p/n: previous/next 上一条/下一条命令

  • Alt+ \</>; 显示第一条/最后一条命令

  • Ctrl+ o: 执行历史纪录里的当前条目,并自动显示下一个命令

!快捷键

  • !!:执行上一个命令。

  • !n:n为数字,执行历史文件里面行号为n的命令。

  • !-n:执行当前命令之前n条的命令。

  • !string:执行最近一个以指定字符串string开头的命令。

  • !?string:执行最近一条包含字符串string的命令。

  • !$:代表上一个命令的最后一个参数。

  • !*:代表上一个命令的所有参数,即除了命令以外的所有部分。

  • \^string1\^string2:执行最近一条包含string1的命令,将其替换成string2。