BLOG

Record, summarize, and improve.

bash

高级 Bash 脚本指南

声明

#!/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
Image in a image block

注意

当程序指定到条件语句;;&时,不会停止,直到执行到;;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}
  • 在正则表达式中被定义为行末
  • 特殊变量.例如下面的
  • $n n是整数,参数变量(像脚本输入选项)和函数参数的调用
  • $* 所有参数变量,"$*"是一个字符串
  • $@ 所有参数变量,"$@"还是逐个逐个的返回变量
  • $? 上次命令运行的返回值
  • $$ 进程ID变量,这个变量保存了运行当前脚本的进程ID值。

! 非,历史操作

  • [ ! -z $a ]判断表达式中的否逻辑
  • !(*.pdf) 匹配内容外的其余内容,这里是非pdf文件
  • [!123] 表示非指定字符外的任意单字符
  • != 字符串不等于.
  • bang命令,操作历史命令,不能用于脚本!只能在命令行使用. 更多请参考Ref7.
    • !grep 执行最近执行的开头匹配的命令
    • !n n为数字,执行历史编号(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加载脚本
  • .avi linux隐藏文件前缀
  • 正则表达式中,点号表示任意一个字符。

" " 字符串

  • 字符串,$会起效,用来表达' '

' ' 字符串

  • 字符串,但$变量化失效,但转义起效.还用在可以用来表达"".

` ` 执行

  • 执行里面的指令.

| 管道

  • 管道,将上一命令的结果用作下一命令的输入
  • [[ ]]||表或操作.
  • 在命令后面的||表示当前面命令返回否时则执行后面的命令

> 重定向,大于

  • 重定向输出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

:离开历史搜索模式而不运行命令。