Bash学习笔记
基本语法
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。