声明
#!/usr/bin/env bash 方便移植
- set -o vi
将 Bash shell 设置为使用 vi 样式的键绑定,Bash 将以插入模式启动——按 Escape 进入命令模式并使用这些键绑定
- set -o emacs
默认的
if elif else
if condition1
then
statement1
elif condition2
then
statement2
elif condition3
then
statement3
……
else
statementn
fi
标准输入、输出与标准错误输出
系统为这三个文件分配了文件标识符fd(file descripter),在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。它们的文件标识符,分别为0,1,2,关系如下表:
| 文件描述符 | 名称 | 通用缩写 | 默认值 |
| 0 | 标准输入 | stdin | 键盘 |
| 1 | 标准输出 | stdout | 屏幕 |
| 2 | 标准错误 | stderr | 屏幕 |
1.1 输出重定向 语法说明
> 把标准输出重定向到一个新文件,”>” 会覆盖原有的内容。
>>把标准输出重定向到一个文件中,不覆盖原有的内容(追加)。
2>把标准错误重定向到一个文件中
2>>把标准错误重定向到一个文件中(追加)
2>&1把标准输出和错误重定向到一个文件(追加)
1.2 输入重定向
| 语法 | 说明 |
| < | filename文件作为标准输入 |
| << delimiter | 从标准输入中读入,知道遇到delimiter分界符 |
1.3 绑定重定向
| 语法 | 说明 |
| > &m | 把标准输出重定向到文件描述符m中 |
| < &- | 关闭标准输入 |
| > &- | 关闭标准输出 |
2 变量
2.1 环境变量
通过使用printenv可以显示当前的环境变量
本地变量
Shell不需要明确定义类型,事实上Shell变量的值都是字符串,比如我们定义var=45,其实var的值是字符串而非整数,shell变量不需要事先定义就可以使用,如果使用没有定义的变量,这字符串取值为空字符串。
变量名称=”变量Value”,“=”的两边不能有空格,否则shell解释成名称和命令参数。
获取变量使用 $变量名称
| 12 | a="ywq"echo $a |
2.2.1 文件名代换
可以使用*、?、[]对文件名代换
| 匹配符 | 说明 |
| * | 匹配0个多个任意字符 |
| ? | 匹配一个任意字符 |
| [] | 匹配方括号中任意一个字符的一次出现 |
2.2.2 命令代换
将命令替换为命令输出,所有的shell支持使用反引号的方式进行命令替换,命令替换可以嵌套,需要注意的是如果使用反引号的形式,在内部反引用前必须使用反斜杠转移
| 匹配符 | 说明 |
| `` | 例如 echo ${pwd} |
| $() | 例如 echo `pwd` |
2.2.3 算术代换
| 匹配符 | 说明 |
| $(()) | 例如 echo $((4 + 6)) |
3 符号
3.1 转义字符
‘\’用作转义字符。
3.2 单引号
单引号内的所有字符都保持它本身字符的意思,而不会被bash进行解释。
3.3 双引号
除了$、``、/外,双引号内所有的字符保持字符本身的含义。
4 逻辑判断
4.1 if
在shell中用if,then,elif,else,fi这几条命令实现分支控制,这种流程控制语句本质上也是由若干个逻辑判断组成,需要注意的是。
- if/then结束都离不开fi
- if和[]注意用空格隔开,]后面紧跟;
- []内的条件与都有一个空格隔开
例如:
| 123 | if [ -f $a ];then echo "hello world!" fi |
4.2 case
case结构用于多种情况的条件判断,类似于其它语言的switch/case,但从语法结构上有很大的不同,常用格式。
| 1234567891011 | case 字符串 in 模式) 语句 ;; 模式2 | 模式3) 语句 ;; *) 默认执行的 语句 ;;esac |
例如
| 123456789101112131415 | #!/bin/bashread -p "请输入要查查询的区号:" numcase $num in *)echo -n "中国";;& 03*)echo -n "河南省";;& ??71)echo "郑州市";; ??72)echo "安阳市";; ??73)echo "新乡市";; ??73)echo "许昌市";; 07*)echo -n "江西省";;& ??91)echo "南昌市";; ??92)echo "九江市";; ??97)echo "赣州市";;esac |
注意
当程序指定到条件语句;;&时,不会停止,直到执行到;;esac
不管是if还是case,他们的结尾都很有意思,if的结尾是fi,而case的结尾是easc,首位和尾部正好相反。
5. 循环
5.1 for
例如:
打印目录下所有的文件
| 1234 | #!/bin/bashfor i in $( ls ); do echo item: $idone |
打印序列
| 12345 | #!/bin/bashfor n in $(seq 1 10);do echo $ndone |
5.2 while
例如:
| 1234567 | #!/bin/bashcounter=$1while [ $counter -lt 10 ];do echo the counter is $counter counter=$(($counter+1))done |
5.3 until
例如:
| 1234567 | #!/bin/bashcounter=$1until [ $counter -lt 10 ];do echo the counter:$counter let counter=counter-1done |
6 比较运算
6.1 比较符
| 比较符 | 说明 | 举例 |
| -e filename | 如果filename存在,则为真 | [ -e /var/log/syslog ] |
| -d filename | 如果filename为目录,则为真 | [ -d /tmp/mydir ] |
| -f filename | 如果filename常规文件,则为真 | [ -f /usr/bin/grep ] |
| -L filename | 如果filename为符号链接,则为真 | [ –L /usr/bin/grep ] |
| -r filename | 如果filename可读,则为真 | [ –r /var/log/syslog ] |
| -w filename | 如果filename可写,则为真 | [ –w /varmytmp.txt ] |
| -x filename | 如果filename可执行,则为真 | [ –x /usr/bin/grep ] |
| -s filename | 如果filename不是空白文件,则为真 | |
| -u filename | 如果filename有SUID属性,则为真 | |
| -g filename | 如果filename有SGID属性,则为真 | |
| -k filename | 如果filename有stickybit属性,则为真 | |
| file1 –nt file2 | 如果file1比file2新,则为真 | |
| file1 –ot file2 | 如果file1比file2旧,则为真 |
6.2 字符串比较运算符
| 比较符 | 说明 | 举例 |
| -z string | 如果string长度为零,则为真 | |
| -n string | 如果string长度不为零,则为真 | |
| str1 = str2 | 如果str1与str2相同,则为真 | |
| str1 != str2 | 如果str1与str2不相同,则为真 |
6.3 算数比较符
| 比较符 | 说明 | 举例 |
| -eq | 等于 | |
| -ne | 不等于 | |
| -lt | 小于 | |
| -le | 小于或等于 | |
| -gt | 大于 | |
| -ge | 大于或等于 |
Bash符号用途的小结
$ 调用变量
- 调用变量,一般
$var即可,和字符连接时最好用${var} - 在正则表达式中被定义为行末
- 特殊变量.例如下面的
-
$nn是整数,参数变量(像脚本输入选项)和函数参数的调用 -
$*所有参数变量,"$*"是一个字符串 -
$@所有参数变量,"$@"还是逐个逐个的返回变量 -
$?上次命令运行的返回值 -
$$进程ID变量,这个变量保存了运行当前脚本的进程ID值。
! 非,历史操作
-
[ ! -z $a ]判断表达式中的否逻辑 -
!(*.pdf)匹配内容外的其余内容,这里是非pdf文件 -
[!123]表示非指定字符外的任意单字符 -
!=字符串不等于. - bang命令,操作历史命令,不能用于脚本!只能在命令行使用. 更多请参考Ref7.
-
!grep执行最近执行的开头匹配的命令 -
!nn为数字,执行历史编号(history)第n的命令 -
!-n执行之前第几条命令,!-1等于!! -
!!执行上一条命令 -
!?command?执行回检最近的符合的指令.完全匹配可以忽略最后的?. -
!!:s/a/b/将上条命令的a变为b(一次) -
!!:gs/a/b/将上条命令的a变为b(全部) -
^a^b将上一条命令的a变为b,等价于!!:s/a/b/ -
^a删掉上一命令的a -
!#重复当前命令的前面部分.如ls ~ !#等价于ls ~ ls ~(有何用?)
-
& 背景,and
- 加在命令最后,表示背景运行
- 在
[[ ]]中&&表与and操作. - 在命令后面的
&&表示当前面命令返回正确时则执行后面的命令
{} 变量名,逐个扩展,代码块
- 变量名调用时定义变量名
- 大括号扩展,逐一输出组合情况.如
a-{a,b,c}会输出aa ab ac.大括号内不许留空格,除非在字符串内或转义. - 字符列表扩展,
{a..h}会逐一输出这些字符,只支持a-z,A-Z,0-9这样.大括号内不允许留空格.其实是特殊的大括号扩展.bash3后引进. - function中的代码块
[] 判断运算,数组号,指定单匹配
[ ] 判断表达式,\<\>需要转义 -
[[ ]]带有模式匹配的判断表达式,<>不需转移,支持&& ||逻辑操作,变量可不需要$. -
array[n]调用数组元素 -
[!123]和[a-h]中表示任一匹配的单字符 -
$[3+7]将运算结果返回
() 运算,调用
- 优先运算
-
array=(1 2 3)定义数组 -
((1+2))数值计算,可以作为判断条件,非0时为真.注意不返回计算结果. -
a=$(date)直接调用函数并运行,将结果像变量一样返回.类似于` ` -
a=$((3+7))输出运算结果并返回
通配,乘
- 任意数量字符的通配符
- 乘法和
*乘方(expr中不支持乘方,乘法也要转义) - 在
"$*"表示将所有参数变量作为一个字符串返回 - 正则表达式中可以作为字符限定符,表示其前面的匹配规则匹配任意次.
? 匹配
- 单字符通配符
-
$?上次指令的返回值.0为正常返回. - 正则表达式中,表示匹配其前面规则0次或者1次
. 目录
-
.和..代表当前和上级目录 -
. hello.sh相当于source命令,当前shell加载脚本 -
.avilinux隐藏文件前缀 - 正则表达式中,点号表示任意一个字符。
" " 字符串
- 字符串,
$会起效,用来表达' '
' ' 字符串
- 字符串,但
$变量化失效,但转义起效.还用在可以用来表达"".
` ` 执行
- 执行里面的指令.
| 管道
- 管道,将上一命令的结果用作下一命令的输入
- 在
[[ ]]中||表或操作. - 在命令后面的
||表示当前面命令返回否时则执行后面的命令
> 重定向,大于
- 重定向输出stdout,
>存在则覆盖,>>追加 -
1>和2>,前者stdout,后者stderr.2>&1错误重定向到stdout文件 - 大于,在
[]中要转义,[[]]中不需要
< 重定向,小于
- 重定向输入
- 小于,在
[]中要转义,[[]]中不需要
@ 表示逐一
-
$@表示所有参数变量,即使加了""依然逐个处理. -
${@:3}同上,指第三参数开始所有参数变量
# 注释,左起匹配
- 注释
-
${#var}中表返回长度数量,${#array[*]}数组元素数量 -
${字串#匹配字串}左起匹配的最短字符串(支持等)的删去,像/home/hi/abc.txt的${var#*/}是home/hi/abc.txt -
${字串##匹配字串}左起匹配的最长字符串(支持等)的删去,上例,${var##*/}是abc.txt -
${变量1/#查找字符/替换字符}左起匹配的替换,可以不输入#也行
% 求余,右起匹配
- 求余运算
5%1 -
${字串%匹配字串}右起匹配的最短字符串(支持*等)的删去,像/home/hi/abc.txt的${var%.*}是/home/hi/abc -
${字串%匹配字串}右起匹配的最长字符串(支持*等)的删去,像/home/hi.ok/abc.txt的${var%%.*}是/home/hi -
${变量1/%查找字符/替换字符}右起匹配的替换
/ 表示分隔,除法,替换
- linux/mac下目录符
- 数学运算中的除法
-
${变量1/查找字符/替换字符}或sed等正则式中表示分隔. -
${变量1//查找字符/替换字符}将所有查找到的字符替换为替换字符串
\ 转义
- 转义符,例如
\n\t输出换行和tab,\\输出\. - 在行末使用
\可以转义换行符,从而使下一行相当于续行.
~特殊目录
- 相对路径中表示用户目录
-
~+当前目录,相当于pwd -
~-上次所在目录,相当于
^ 正则行首符
- 在正则表达式中,行首位置标志符;
-
^a^b将上一条命令的a变为b,bang命令 -
^a删掉上一命令的a,bang命令 - bash4后,
${var^},${var^^}表示首字符大写和全部大写.不建议使用
; 语句终结和分隔
- 同一行多个语句分隔符
-
;;case语句选项的终结符
,
- 在表达式中前后均执行,但只返回最后一句.如
let k=((a=3,b=4)) - 在bash4以后,
${a,},${a,,}表示首字符小写和全部小写.不推荐使用.
+ 加号
- 数学运算的加法
- 在正则表达式中,表示的是其前的这个匹配规则匹配最少一次;
相减,参数选项,范围
- 数学运算的减法
-
l --help命令选项 - 相对路径中表示上一次所在的目录
-
[a-h]中表示范围. -
[ -f abc.txt ]在判断表达式中控制选项,数学比较eq,-nq,逻辑o,-a等.
= 赋值或相等
-
a=1变量赋值 -
[ a = b ]字符串相等比较,==等价.
: 表示位置,空命令
-
${var:3}表示第四个字符起的字符串(因为从0起),支持负数表达反向 -
${var:开始位置:结束位置}某个范围内字符串.不支持负数 -
${@:3}中表示第三个起以后的项 - 总返回0的空命令,可替代true用于while循环,也可用于空语句块避免语法错误.
- unix系统的域分界符,如PATH变量分开每个值.
小括号,圆括号 ()
1、单小括号 ()
- 命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
- 命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。
- 用于初始化数组。如:array=(a b c d)
2、双小括号 (( ))
- 整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是"假",而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。若是逻辑判断,表达式exp为真则为1,假则为0。
- 只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
- 单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6
- 常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in `seq 0 4`或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ]。
中括号,方括号[]
1、单中括号 []
- bash 的内部命令,[]和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。
- Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
- 字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。
- 在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。
2、双中括号[[ ]]
- [[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
- 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
- 使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。
- bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。。
if ($i<5)
if [ $i -lt 5 ]
if [ $a -ne 1 -a $a != 2 ]
if [ $a -ne 1] && [ $a != 2 ]
if [[ $a != 1 && $a != 2 ]]
for i in $(seq 0 4);do echo $i;done
for i in `seq 0 4`;do echo $i;done
for ((i=0;i<5;i++));do echo $i;done
for i in {0..4};do echo $i;done 大括号、花括号 {}
1、常规用法
(1) 大括号拓展。(通配(globbing))将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。
第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。
第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,如:touch {a..d}.txt 结果为a.txt b.txt c.txt d.txt
# ls {ex1,ex2}.sh
ex1.sh ex2.sh
# ls {ex{1..3},ex4}.sh
ex1.sh ex2.sh ex3.sh ex4.sh
# ls {ex[1-3],ex4}.sh
ex1.sh ex2.sh ex3.sh ex4.sh (2) 代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。
2、几种特殊的替换结构
${var:-string}
${var:+string}
${var:=string}
${var:?string} 1、${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
2、${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
3、{var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。
3、四种模式匹配替换结构
模式匹配记忆方法:
# 是去掉左边(在键盘上#在$之左边)
% 是去掉右边(在键盘上%在$之右边) #和%中的单一符号是最小匹配,两个相同符号是最大匹配。
${var%pattern}
${var%%pattern
${var#pattern}
${var##pattern} - 第一种模式:${variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式
- 第二种模式: ${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
- 第三种模式:${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式
- 第四种模式: ${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
- 这四种模式中都不会改变variable的值,其中,只有在pattern中使用了*匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,*表示零个或多个任意字符,?表示仅与一个任意字符匹配,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。
# var=testcase
# echo $var
testcase
# echo ${var%s*e}
testca
# echo $var
testcase
# echo ${var%%s*e}
te
# echo ${var#?e}
stcase
# echo ${var##?e}
stcase
# echo ${var##*e}
# echo ${var##*s}
e
# echo ${var##test}
case 4、字符串提取和替换
${var:num}
${var:num1:num2}
${var/pattern/pattern}
${var//pattern/pattern} - 第一种模式:${var:num},这种模式时,shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。
- 第二种模式:${var:num1:num2},num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。
- 第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。
- 第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。
[root@centos ~]# var=/home/centos
[root@centos ~]# echo $var
/home/centos
[root@centos ~]# echo ${var:5}
/centos
[root@centos ~]# echo ${var: -6}
centos
[root@centos ~]# echo ${var:(-6)}
centos
[root@centos ~]# echo ${var:1:4}
home
[root@centos ~]# echo ${var/o/h}
/hhme/centos
[root@centos ~]# echo ${var//o/h}
/hhme/cenths 符号$后的括号
- (1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。
- (2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。
- (3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。
使用
- 1、多条命令执行
- (1)单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。
- (2)单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
对 {} 和 () 而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。
快捷键
Ctrl-a 光标移动到开始位置
Ctrl-e 光标移动到最末尾
Ctrl-k 删除光标至末尾的所有内容
Ctrl-u 删除光标至开始的所有内容
Ctrl-w 由光标位置开始,往左删除单词。往行首删
Ctrl-a + Ctrl-k 或 Ctrl-e + Ctrl-u 或 Ctrl-k + Ctrl-u 组合可删除整行。
Ctrl+y 粘贴由 Ctrl+u , Ctrl+d , Ctrl+w 删除的单词
Ctrl+l 相当于clear,即清屏
- Ctrl+C
:中断(杀死)在终端中运行的当前前台进程。这会向进程发送SIGINT信号,这在技术上只是一个请求——大多数进程会尊重它,但有些进程可能会忽略它。
- Ctrl+Z
:暂停当前在 bash 中运行的前台进程。这会向进程发送 SIGTSTP 信号。稍后要将进程返回到前台,请使用该fg process_name命令
- Ctrl+D
:关闭 bash shell。这会向 bash 发送一个 EOF(文件结束)标记,bash 在收到此标记时退出。这类似于运行exit 命令。
- Ctrl+L
:清屏。这类似于运行“clear”命令。
- Ctrl+S
:停止所有输出到屏幕。这在运行具有大量冗长输出的命令时特别有用,但您不想使用 Ctrl+C 停止命令本身。
- Ctrl+Q
: 使用 Ctrl+S 停止后恢复输出到屏幕。
- Ctrl+A或Home
:转到行首。
- Ctrl+E或End
:转到行尾。
- Alt+B
:向左(返回)一个字。
- Ctrl+B
:向左(后退)一个字符。
- Alt+F
:向右(前进)一个字。
- Ctrl+F
:向右(前进)一个字符。
- Ctrl+XX
:在行首和光标当前位置之间移动。这允许您按 Ctrl+XX 返回到行首,更改某些内容,然后按 Ctrl+XX 返回到原始光标位置。要使用此快捷方式,请按住 Ctrl 键并点击 X 键两次。
- Ctrl+D或Delete
:删除光标下的字符。
- Alt+D
:删除当前行光标后的所有字符。
- Ctrl+H或Backspace
:删除光标前的字符。
- Alt+T
:将当前单词与前一个单词交换。
- Ctrl+T
:相互交换光标前的最后两个字符。当您以错误的顺序键入两个字符时,您可以使用它来快速修复拼写错误。
- Ctrl+_
:撤消上次按键操作。您可以重复此操作以多次撤消。
- Ctrl+W
:剪切光标前的单词,将其添加到剪贴板。
- Ctrl+K
:剪切光标后的那部分行,将其添加到剪贴板。
- Ctrl+U
:剪切光标前的那部分行,将其添加到剪贴板。
- Ctrl+Y
:粘贴您从剪贴板剪切的最后一个内容。这里的 y 代表“猛拉”。
- Alt+U
:将光标到当前单词末尾的每个字符都大写,将字符转换为大写。
- Alt+L
:取消从光标到当前单词末尾的每个字符的大写,将字符转换为小写。
- Alt+C
:将光标下的字符大写。您的光标将移动到当前单词的末尾。
- Ctrl+P或向上箭头
:转到命令历史记录中的上一个命令。多次按下快捷键可返回历史记录。
- Ctrl+N或向下箭头
:转到命令历史记录中的下一个命令。多次按下快捷键可向前浏览历史记录。
- Alt+R
:如果您编辑过历史记录,则还原对您从历史记录中提取的命令的任何更改。
Bash 还有一个特殊的“调用”模式,你可以用它来搜索你之前运行过的命令:
- Ctrl+R
:调用与您提供的字符匹配的最后一个命令。按此快捷方式并开始输入以在 bash 历史记录中搜索命令。
- Ctrl+O
:运行您使用 Ctrl+R 找到的命令。
- Ctrl+G
:离开历史搜索模式而不运行命令。