Linux就是未来!在Linux下,Bash的地位无可忽视,日常工作中涉及到Linux下的管理与操作基本都是在Bash中进行,因此,为了提高Linux下工作效率,自然而然的就变成了如何高效使用Bash的问题。
快捷键
常用快查指南,也可以看这里 Bash Shortcuts
编辑命令
- Ctrl + a :移到命令行首
- Ctrl + e :移到命令行尾
- Ctrl + f :按字符前移(右向)
- Ctrl + b :按字符后移(左向)
- Alt + f :按单词前移(右向)
- Alt + b :按单词后移(左向)
- Ctrl + xx:在命令行首和光标之间移动
- Ctrl + u :从光标处删除至命令行首
- Ctrl + k :从光标处删除至命令行尾
- Ctrl + w :从光标处删除至字首
- Alt + d :从光标处删除至字尾
- Ctrl + d :删除光标处的字符
- Ctrl + h :删除光标前的字符
- Ctrl + y :粘贴至光标后
- Alt + c :从光标处更改为首字母大写的单词
- Alt + u :从光标处更改为全部大写的单词
- Alt + l :从光标处更改为全部小写的单词
- Ctrl + t :交换光标处和之前的字符
- Alt + t :交换光标处和之前的单词
- Alt + Backspace:与 Ctrl + w
相同类似,分隔符有些差别 [感谢 rezilla 指正]
重新执行命令
- Ctrl + r:逆向搜索命令历史
- Ctrl + g:从历史搜索模式退出
- Ctrl + p:历史中的上一条命令
- Ctrl + n:历史中的下一条命令
- Alt + .:使用上一条命令的最后一个参数
控制命令
- Ctrl + l:清屏
- Ctrl + o:执行当前命令,并选择上一条命令
- Ctrl + s:阻止屏幕输出
- Ctrl + q:允许屏幕输出
- Ctrl + c:终止命令
- Ctrl + z:挂起命令
Bang (!) 命令
- !!:执行上一条命令
- !blah:执行最近的以 blah 开头的命令,如 !ls
- !blah:p:仅打印输出,而不执行
- !$:上一条命令的最后一个参数,与 Alt + . 相同
- !的内容
- !*:上一条命令的所有参数
- !:p:打印输出 ! 的内容
^blah
:删除上一条命令中的 blah^blah^foo
:将上一条命令中的 blah 替换为 foo^blah^foo^
:将上一条命令中所有的 blah 都替换为 foo
详细介绍
快捷键的一些说明:
- CTRL=C:这个键是指PC键盘上的Ctrl键
- ALT=M:这个键是PC键盘上的ALT键,如果你键盘上没有这个键,可以尝试使用ESC键代替
- SHIFT=S:此键是PC上的Shift键
- ESC=E:这个键是PC键盘上的ESC键,此键一般在键盘的左上角
- BACKSPACE=DEL:此键是是PC键盘上的Backspace键,一般位于主键盘区的右上角
- 文中”[]“括住的为快捷键内容,”-”两边的内容是按住左边键,再按右边键获得,”,”逗号两边的内容是先按左边键,松开后再按右边键。如:[CTRL-v]是表示按下Ctrl键之后,不要松开,再按下v键。
- 默认的情况下,快捷键的组成格式是:<CTRL | ALT | ESC >-[SHIFT-]。即由Ctrl、Alt、Esc之一开头,中划线,Shift,中划线,和一个字符组成。其中,中括号内的Shift和”-”有时可省略。
- 默认情况下,快捷键只有最后一个为字符,其他的键值均为功能键
- 出现[CTRL-?]这类快捷键,由于”?”是需要使用Shift按键才能获得的字符,因此此类快捷键默认使用的是[CTRL-SHIFT-?]
要注意,在Bash里面,快捷键可能会被写成八进制或者十六进制的形式(跟在转义符后面); 脚本文件中的快捷键并不是总能起作用的。另外快捷键有个规律,Ctrl开头的快捷键一般是针对字符的,而Alt开头的快捷键一般是针对词的。
Bash下,如果使用的是shell脚本文件,快捷键不一定是一样的,有的时候会出现同一个快捷键有不同的表现,这种情况一般是由于Bash所处的模式不同而引起的,你可以通过set命令来调整模式:
这个是Bash的option选项,你可以根据具体情况进行设置,本文使用的是emacs模式。
快捷键 | 快捷键说明 |
---|
CTRL-A | 将光标移到行首(在命令行下) |
CTRL-B | 退格 (非破坏性的),这个只是将光标位置往回移动一个位置。 |
CTRL-C | 中断,终结一个前台作业。 |
CTRL-D | “EOF” (文件结尾:end of file)。它用于表示标准输入(stdin)的结束。在控制台或xterm 窗口输入文本时,CTRL-D 删除在光标下的字符。从一个shell中退出 (类似于exit)。如果没有字符存在,CTRL-D 则会登出该会话。在一个xterm窗口中,则会产生关闭此窗口的效果。 |
CTRL-E | 将光标移动到行尾(在命令行下) |
CTRL-F | 将光标向前移动一个字符(在命令行下) |
CTRL-G | BEL。在一些老式打印机终端上,这会引发一个响铃。在xterm终端上可能是哔的一声。 |
CTRL-H | 擦除(Rubout)(破坏性的退格)。在光标往回移动的时候,同时擦除光标前的一个字符。 |
CTRL-I | 水平制表符。 |
CTRL-J | 新行(换行[line feed]并到行首)。在脚本中,也可能表示为八进制形式(‘/012′)或十六进制形式(‘/x0a’)。 |
CTRL-K | 垂直制表符(Vertical tab)。在控制台或 xterm 窗口输入文本时,CTRL-K会删除从光标所在处到行尾的所有字符。在脚本中,也可能表示为八进制形式(‘/013′)或十六进制形式(‘/x0b’)。在脚本中,CTRL-K可能会有不一样的行为,下面的例子给出其不一样的行为:`#!/bin/bash ## 一个CTRL-K垂直制表符的例子 var=var" ## 使用col来过滤控制字符 echo “$var” |
CTRL-L | 跳纸,换页(Formfeed),清屏。清空终端屏幕。在终端上,这个命令的作用和clear命令一样。但当这个命令发送到打印机时,Ctrl-L会直接跳到纸张(Paper sheet)的末尾。 |
CTRL-M | 回车(Carriage return)。 |
CTRL-N | 擦除从history缓冲区召回的一行文本(在命令行下)。如果当前输入是历史记录中选择的时候,这个是从这个历史记录开始,每按一次,是更接近的一条命令。 |
CTRL-O | 产生一个新行(在命令行下)。 |
CTRL-P | 从history缓冲区召回上一次的命令(在命令行下)。此快捷键召回的顺序是由近及远的召回,即按一次,召回的是前一次的命令,再按一次,是召回上一次之前的命令,这和CTRL-N都是以当前的输入为起点,但是两个命令操作刚好相反,CTRL-N是从起点开始由远及近(如果起点是历史命令的话)。 |
CTRL-Q | Resume (XON)。恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL-S。 |
CTRL-R | 回溯搜索(Backwards search)history缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)”:输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令。 |
CTRL-S | Suspend(XOFF),挂起。这个是冻结终端的stdin。要恢复可以按CTRL-Q。 |
CTRL-T | 交换光标位置与光标的前一个位置的字符内容(在命令行下)。比如:echo $var;,假设光标在a上,那么,按下C-T之后,v和a将会交换位置:echo $avr;。 |
CTRL-U | 擦除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL-U会不以光标位置为参考而删除整行的输入。 |
CTRL-V | 在输入文本的时候,按下C-V之后,可以插入控制字符。比如:echo -e '/x0a’;和echo;这两种效果一样。这点功能在文本编辑器内非常有效。 |
CTRL-W | 当在控制台或一个xterm窗口敲入文本时, CTRL-W 会删除从在光标处往后(回)的第一个空白符之间的内容。在某些设置里, CTRL-W 删除光标往后(回)到第一个非文字和数字之间的字符。 |
CTRL-X | 在某些文字处理程序中,这个控制字符将会剪切高亮的文本并且将它复制到剪贴板中。 |
CTRL-Y | 将之前已经清除的文本粘贴回来(主要针对CTRL-U或CTRL-W)。 |
CTRL-Z | 暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符。 |
CTRL-/ | 退出。和CTRL-C差不多,也可能dump一个”core”文件到你的工作目录下(这个文件可能对你没用)。 |
CTRL-/ | 撤消操作,Undo。 |
CTRL-_ | 撤消操作。 |
CTRL-xx | 在行首和光标两个位置间进行切换,此处是两个”x”字符。 |
ALT-B | 光标往回跳一个词,词以非字母为界(跳动到当前光标所在词的开头)。 |
ALT-F | 光标往前跳一个词(移动到光标所在词的末尾)。 |
ALT-D | 删除光标所在位置到光标所在词的结尾位置的所有内容(如果光标是在词开头,则删除整个词)。 |
ALT-BASKSPACE | 删除光标所在位置到词开头的所有内容。 |
ALT-C | 将光标所在位置的字母转为大写(如果光标在一个词的起始位置或之前,则词首字母大写)。 |
ALT-U | 将光标所在位置到词尾的所有字母转为大写。 |
ALT-L | 将光标位置到词尾的所有字母转为小写。 |
ALT-R | 取消所有变更,并将当前行恢复到在历史记录中的原始状态(前提是当前命令是从历史记录中来的,如果是手动输入,则会清空行)。 |
ALT-T | 当光标两侧都存在词的时候,交换光标两侧词的位置。如:abcbcd -> bcd abc |
ALT-. | 使用前一次命令的最后一个词(命令本身也是一个词,参见后一篇的Bang命令中的词指示符概念)。 |
ALT-_ | 同ALT-.。 |
ALT-数值 | 这个数值可以是正或者是负,这个键单独没有作用,必须后面再接其他内容,如果后面是字符,则表示重复次数。如:[ALT-10,k]则光标位置会插入10个k字符(负值在这种情况下无效);如果后面接的是命令,则数字会影响后面命令的执行结果,如:[ALT–10,CTRL-D]则向CTRL-D默认方向相反(负数)的方向执行10次操作。 |
ALT-< | 移动到历史记录中的第一行命令。 |
ALT-> | 移动到历史的最后一行,即当前正在输入的行(没有输入的情况下为空)。 |
ALT-P | 从当前行开始向前搜索,有必要则向”上”移动,移动时,使用非增量搜索查找用户提供的字符串。 |
ALT-N | 从当前行开始向后搜索,如果有必要向”下”移动,移动时,使用非增量搜索查找用户提供的字符串。 |
ALT-CTRL-Y | 在标志点上插入前一个命令的第一个参数(一般是前一行的第二个词)。如果有参数n,则插入前一个命令的第n个词(前一行的词编号从0开始,见历史扩展)。负的参数将插入冲前一个命令的结尾开始的第n个词。参数n通过M-No.的方式传递,如:[ALT-0,ALT-CTRL-Y]插入前一个命令的第0个词(命令本身)。 |
ALT-Y | 轮询到删除环,并复制新的顶端文本。只能在yank[CTRL-Y]或者yank-pop[M-Y]之后使用这个命令。 |
ALT-? | 列出能够补全标志点前的条目。 |
ALT-* | 把能够补全[ALT-?]命令能生成的所有文本条目插入到标志点前。 |
ALT-/ | 试图对标志点前的文本进行文件名补全。[CTRL-X,/]把标志点前的文本当成文件名并列出可以补全的条目。 |
ALT-~ | 把标志点前的文本当成用户名并试图进行补全。[CTRL-X,~]列出可以作为用户名补全标志点前的条目。 |
ALT-$ | 把标志点前的文本当成Shell变量并试图进行补全。[CTRL-X,$]列出可以作为变量补全标志点前的条目。 |
ALT-@ | 把标志点前的文本当成主机名并试图进行补全。[CTRL-X,@]列出可以作为主机补全标志点前的条目。 |
ALT-! | 把标志点前的文本当成命令名并试图进行补全。进行命令名补全时会依次使用别名、保留字、Shell函数、shell内部命令,最后是可执行文件名。[CTRL-X,!]把标志点前的文本当成命令名并列出可补全的条目。 |
ALT-TAB | 把标志点前的文本与历史记录中的文本进行比较以寻找匹配的并试图进行补全。 |
ALT-{ | 进行文件名补全,把可以补全的条目列表放在大括号之间,让shell可以使用。 |
在Bash下,如果能够妥善的使用快捷键,在Linux系统的操作会变得非常快捷,比如我们在使用cat创建一个文件时,我们可以使用快捷键[CTRL-D]:
有的时候我们需要创建一个文件,而后对这个文件进行操作:
怎么样,有没有更有效率?
当然,Bash的快捷键只有在不断的使用中,才能达到真正的高效,在开始连要用那个快捷键都要思考半天的情况下,高效是很难的——但磨刀不误砍材工,前期的投入是值得的。
如果你想自己的Bash有那么一些不同,你也可以自己自定义快捷键,使用bind命令即可,Bash中的快捷键其实是Readline来提供的,因此,这里快捷键的设置其实就是配置Readline,Readline中分两种快捷键,一种是Readline内部的函数快捷键,另外一种是执行Shell命令,设置的时候稍有不同:
这种设置只是针对当前的会话有效,一旦会话丢失,这样设置的快捷键就会丢失,为了能够让设置的快捷键永久有效,我们就需要将快捷键的配置写入文件。在Linux系统中,能永久保存快捷键的地方有两个,全局和用户的配置文件,全局的是/etc/inputrc,而用户的是在用户的根目录下~/.inputrc,全局的会影响所有的用户,而用户根目录下的只会对相应的用户产生影响。inputrc文件的大概样子像下面这样:
说明:
在配置文件中,/C代表CTRL,/M代表ALT,/e代表ESC,//是反斜杠/,/'是单引号,/"是双引号;
如果要查看某一个功能键的字符序列可以通过[CTRL-V]来实现,或者输入cat后回车,进入编辑中,直接按快捷键
配置文件中可能会使用八进制或者十六进制来表示字符。
如果我们针对常用的操作设置成适当的快捷键,也许以前需要巴拉巴拉敲上半天的命令,你一个快捷键就能搞定,这无疑将会大大的提高我们的工作效率!
Bash 别名
10 个方便的 Bash 别名
1、 你有几次遇到需要解压 .tar
文件但无法记住所需的确切参数?别名可以帮助你!只需将以下内容添加到 .bash_profile
中,然后使用 untar FileName
解压缩任何 .tar
文件。
2、 下载文件时,如果出现问题想要恢复下载?
3、 快速为新的帐户生成随机的 20 个字符的密码。
4、 对下载的文件进行校验和测试。
5、 普通的 ping
将永远持续下去。通常我们不希望这样,让我们将其限制在五次之内。
6、 在任何你想要的文件夹中启动一个 Web
服务器。
7、 想知道你的网络有多快?只需下载 Speedtest-cli
并使用此别名即可。你可以使用 speedtest-cli --list
命令选择离你所在位置更近的服务器。
8、 在命令行中快速获取你的外部 IP
地址。
9、 在命令行中快速获取你的本地 IP
地址。
10、 快速清空屏幕。
如你所见,Bash
别名是一种在命令行上简化操作的超级简便方法。想了解更多信息?建议你 Google
搜索 “Bash 别名”
或在 Github
中找找看。
Bash 参数处理
在编写shell程序时经常需要处理命令行参数,本文描述在bash下的命令行处理方式。
选项与参数:
如下命令行:
-f为选项,它需要一个参数,即config.conf, -v 也是一个选项,但它不需要参数。
–prefix我们称之为一个长选项,即选项本身多于一个字符,它也需要一个参数,用等号连接,当然等号不是必须的,/home可以直接写在–prefix后面,即–prefix/home,更多的限制后面具体会讲到。
在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。
- 手工处理方式
- getopts
- getopt
依次讨论这三种处理方式。
手工处理方式
在手工处理方式中,首先要知道几个变量,还是以上面的命令行为例:
例子:
执行./test.sh -f config.conf -n 10 会打印:
所以,手工处理的方式即对这些变量的处理。因为手工处理高度依赖于你在命令行上所传参数的位置,所以一般都只用来处理较简单的参数。
例如:
./test.sh 10
而很少使用./test -n 10这种带选项的方式。 典型用法为:
为什么要使用 x$1 != x 这种方式来比较呢?想像一下这种方式比较:
if [ -n $1 ] #$1不为空
但如果用户不传参数的时候,$1为空,这时 就会变成 [ -n ] ,所以需要加一个辅助字符串来进行比较。
手工处理方式能满足大多数的简单需求,配合shift使用也能构造出强大的功能,但在要处理复杂选项的时候建议用下面的两种方法。
getopts/getopt
处理命令行参数是一个相似而又复杂的事情,为此,c提供了getopt/getopt_long等函数,
c++的boost提供了options库,在shell中,处理此事的是getopts和getopt.
getopts和getopt功能相似但又不完全相同,其中getopt是独立的可执行文件,而getopts是由bash内置的。
先来看看参数传递的典型用法:
先来看getopts,它不支持长选项。
使用getopts非常简单:
现在就可以使用:
./test.sh -a arg -b -c
或
./test.sh -a arg -bc
来加载了。
应该说绝大多数脚本使用该函数就可以了,如果需要支持长选项以及可选参数,那么就需要使用getopt.
getopt自带的一个例子:
比如使用
./test -a -b arg arg1 -c
你可以看到,命令行中多了个arg1参数,在经过getopt和set之后,命令行会变为:
-a -b arg -c -- arg1
$1
指向-a, $2
指向-b,$3
指向arg,$4
指向-c,$5
指向–,而多出的arg1则被放到了最后。
总结
一般小脚本手工处理也就够了,getopts能处理绝大多数的情况,getopt较复杂,功能也更强大。
100个实用的经典 Linux Shell 脚本
- 编写 hello world 脚本
- 通过位置变量创建 Linux 系统账户及密码
- 备份日志
- 一键部署 LNMP(RPM 包版本)
- 监控内存和磁盘容量,小于给定值时报警
- 猜数字游戏
- 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员(使用字串对比版本)
- 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员(使用 UID 数字对比版本)
- 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的 123456 作为默认密码。
- 输入三个数并进行升序排序
- 石头、剪刀、布游戏
- 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(for 版本)
- 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(while 版本)
- 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(多进程版)
- 编写脚本,显示进度条
- 进度条,动态时针版本;定义一个显示进度的函数,屏幕快速显示| / ‐ \
- 9*9 乘法表
- 使用死循环实时显示 eth0 网卡发送的数据包流量
- 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息
- 编写批量修改扩展名脚本
- 使用 expect 工具自动交互密码远程其他主机安装 httpd 软件
- 一键部署 LNMP(源码安装版本)
- 编写脚本快速克隆 KVM 虚拟机
- 点名器脚本
- 查看有多少远程的 IP 在连接本机
- 对 100 以内的所有正整数相加求和(1+2+3+4…+100)
- 统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个
- 统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么
- 打印国际象棋棋盘
- 统计每个远程 IP 访问了本机 apache 几次?
- 统计当前 Linux 系统中可以登录计算机的账户有多少个
- 统计/var/log 有多少个文件,并显示这些文件名
- 自动为其他脚本添加解释器信息
- 自动化部署 varnish 源码包软件
- 编写 nginx 启动脚本
- 自动对磁盘分区、格式化、挂载
- 自动优化 Linux 内核参数
- 切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)
- 检测 MySQL 数据库连接数量
- 根据 md5 校验码,检测文件是否被修改
- 检测 MySQL 服务是否存活
- 备份 MySQL 的 shell 脚本(mysqldump版本)
- 将文件中所有的小写字母转换为大写字母
- 非交互自动生成 SSH 密钥文件
- 检查特定的软件包是否已经安装
- 监控 HTTP 服务器的状态(测试返回码)
- 自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)
- 使用脚本自动创建逻辑卷
- 显示 CPU 厂商信息
- 删除某个目录下大小为 0 的文件
- 查找 Linux 系统中的僵尸进程
- 提示用户输入年份后判断该年是否为闰年
- 生成随机密码(urandom 版本)
- 生成随机密码(字串截取版本)
- 生成随机密码(UUID 版本,16 进制密码)
- 生成随机密码(进程 ID 版本,数字密码)
- 测试用户名与密码是否正确
- 循环测试用户名与密码是否正确
- Shell 脚本的 fork 炸弹
- 批量下载有序文件(pdf、图片、视频等等)
- 显示当前计算机中所有账户的用户名称
- 制定目录路径,脚本自动将该目录使用 tar 命令打包备份到/data目录
- 显示进度条(回旋镖版)
- 安装 LAMP 环境(yum 版本)
- 循环关闭局域网中所有主机
- 获取本机 MAC 地址
- 自动配置 rsynd 服务器的配置文件 rsyncd.conf
- 修改 Linux 系统的最大打开文件数量
- 设置 Python 支持自动命令补齐功能
- 自动修改计划任务配置文件
- 使用脚本循环创建三位数字的文本文件(111-999 的文件)
- 找出/etc/passwd 中能登录的用户,并将对应在/etc/shadow 中第二列密码提出处理
- 统计/etc/passwd 中 root 出现的次数
- 统计 Linux 进程相关数量信息
- 从键盘读取一个论坛积分,判断论坛用户等级
- 判断用户输入的数据类型(字母、数字或其他)
- 显示进度条(数字版)
- 打印斐波那契数列
- 判断用户输入的是 Yes 或 NO
- 显示本机 Linux 系统上所有开放的端口列表
- 将 Linux 系统中 UID 大于等于 1000 的普通用户都删除
- 使用脚本开启关闭虚拟机
- 调整虚拟机内存参数的 shell 脚本
- 查看 KVM 虚拟机中的网卡信息(不需要进入启动或进入虚拟机)
- 不登陆虚拟机,修改虚拟机网卡 IP 地址
- 破解虚拟机密码,无密码登陆虚拟机系统
- Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本
- 一键部署 memcached
- 一键配置 VNC 远程桌面服务器(无密码版本)
- 关闭 SELinux
- 查看所有虚拟机磁盘使用量以及CPU使用量信息
- 使用 shell 脚本打印图形
- 根据计算机当前时间,返回问候语,可以将该脚本设置为开机启动
- 读取用户输入的账户名称,将账户名写入到数组保存
- 判断文件或目录是否存在
- 打印各种格式的时间
- 使用 egrep 过滤 MAC 地址
- 统计双色球各个数字的中奖概率
- 生成签名私钥和证书
- 使用 awk 编写的 wc 程序
参考&致谢