今天给伙伴们分享一下Shell 编程-Linux Bash,希望看了有所收获。
我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!
如果伙伴们看了文档觉得有用,欢迎大家关注我的公众号,获取相关文档。爱运维,爱生活。
一、Bash 的初始化
1、Bash 环境变量文件
1、/etc/profile
- 全局(公有)配置,不管是哪个用户,登录时都会读取该文件,只有登录的时候读一次,后续不在关注,改变文件需要立即生效,执行source /etc/profile 。
2、/ect/bashrc
- Ubuntu 没有此文件,与之对应的是 /ect/bash.bashrc
- 它也是全局(公有)的
- bash 执行时,不管是何种方式,都会读取此文件。
3、~/.profile
-
若 bash 是以 login 方式执行时,读取 ~/.bash_profile,若它不存在,则读取 /.bash_login,若前两者不存在,读取/.profile。
-
图形模式登录时,此文件将被读取,即使存在 ~/.bash_profile 和 ~/.bash_login。
4、~/.bash_login
- 若 bash 是以 login 方式执行时,读取 ~/.bash_profile,若它不存在,则读取 ~/.bash_login,若前两者不存在,读取 ~/.profile。
5、~/.bash_profile
-
Unbutu 默认没有此文件,可新建。
-
只有 bash 是以 login 形式执行时,才会读取此文件。通常该配置文件还会配置成去读取 ~/.bashrc。
6、~/.bashrc
- 当 bash 是以 non-login 形式执行时,读取此文件。若是以 login 形式执行,则不会读取此文件。
7、~/.bash_logout
- 注销时,且是 longin 形式,此文件才会读取。在文本模式注销时,此文件会被读取,图形模式注销时,此文件不会被读取。
2、Bash 环境变量加载
-
图形模式登录时,顺序读取:/etc/profile 和 ~/.profile
-
图形模式登录后,打开终端时,顺序读取:/etc/bash.bashrc 和 ~/.bashrc
-
文本模式登录时,顺序读取:/etc/bash.bashrc,/etc/profile 和 ~/.bash_profile
-
从其它用户 su 到该用户,则分两种情况:
- 如果带 -l 参数(或-参数,–login 参数),如:su -l username,则 bash 是 login 的,它将顺序读取以下配置文件:/etc/bash.bashrc,/etc/profile 和~/.bash_profile。
- 如果没有带 -l 参数,则 bash 是 non-login 的,它将顺序读取:/etc/bash.bashrc 和 ~/.bashrc
-
注销时,或退出 su 登录的用户,如果是 longin 方式,那么 bash 会读取:~/.bash_logout
- 执行自定义的 Shell 文件时,若使用 bash -l a.sh 的方式,则 bash 会读取行:/etc/profile 和 ~/.bash_profile,若使用其它方式,如:bash a.sh,./a.sh,sh a.sh(这个不属于bash Shell),则不会读取上面的任何文件。
- 上面的例子凡是读取到 ~/.bash_profile 的,若该文件不存在,则读取 ~/.bash_login,若前两者不存在,读取 ~/.profile。
二、Bash 特性
1、命令和文件自动补齐
-
很多命令都会提供一个 bash-complete 的脚本,在执行该命令时,敲 tab 可以自动补全参数,会极大提高生产效率。
-
linux命令自动补全需要安装 bash-completion
[[email protected] ~]# yum install bash-completion
-
注意: 重启系统后可正常 tab 补齐
-
默认情况下,Bash 为 Linux 用户提供了下列标准补全功能。
- 变量补全
- 用户名补全
- 主机名补全
- 路径补全
- 文件名补全
2、命令历史记忆功能
-
Bash 有自动记录命令的功能,自动记录到.bash_history隐藏文件中。还可以在下次需要是直接调用历史记录中的命令
-
centos 可以通过/etc/profile中的文件来定义一些参数、
-
在bash中,使用history 命令来查看和操作之前的命令,以此来提高工作效率。
-
history是bash的内部命令,所以可以使用 help history命令调出history命令的帮助文档。
-
调用命令的方法:
# 查看之前使用的所有命令
[[email protected] ~]# history
# 显示最近的n个命令
[[email protected] ~]# history n
# 删除相应的第n个命令
[[email protected] ~]# history -d n
# 指定执行命令历史中的第n条语句
[[email protected] ~]# !n
# 指定执行命令历史中倒数第n条语句
[[email protected] ~]# !-n
# 执行命令历史中最后一条语句
[[email protected] ~]# !!
# 执行命令历史中最近一条以[String]开头的语句
[[email protected] ~]# ![String]
# 引用上一个命令中的最后一个参数
[[email protected] ~]# !$
# COMMAND + Esc键 + . 输入COMMAND之后,按下Esc键,松开后再按 . 则可以自动输入最近一条语句使用的参数
# COMMAND + Alt + . 输入COMMAND之后,同时按下Alt和. 键,也可以自动输入最近一条语句使用的参数
# 将命令历史写入命令历史的文件中
[[email protected] ~]# history -w
# 回显 echo 之后的语句,而使用 echo $FILENAME 命令可以查看该 file 所在的路径
[[email protected] ~]# echo $HISTFILE
# 查看命令历史的内容
[[email protected] ~]# cat .bash_history
# 删除所有的命令历史记录
[[email protected] ~]# history -c
3、 别名功能
alias命令,别名的好处是可以把本来很长的指令简化缩写,来提高工作效率。
[[email protected] ~]# alias #查看系统当前所有的别名
[[email protected] ~]# alias h5=‘head -5’ #定义新的别名。这时候输入h5就等于输入’head-5‘
[[email protected] ~]# unalias h5 #取消别名定义
如果想要文件永久生效,只需将上述别名命令写到对应用户或者系统 bashrc 文件中
如果想用真实命令可以在命令前面添加反斜杠 ,使别名失效
[[email protected] ~]# \cp -rf /etc/hosts
4、快捷键
快捷键 | 作用 |
---|---|
ctrl+A | 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。 |
ctrl+E | 把光标移动到命令行结尾。 |
ctrl+C | 强制终止当前的命令。 |
ctrl+L | 清屏,相当于clear命令。 |
ctrl+U | 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便 |
ctrl+K | 删除或剪切光标之后的内容。 |
ctrl+Y | 粘贴ctrl+U或ctul+K剪切的内容。 |
ctrl+R | 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。 |
ctrl+D | 退出当前终端。 exit |
ctrl+Z | 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍。 |
ctrl+S | 暂停屏幕输出。 |
ctrl+Q | 恢复屏幕输出。 |
5、前后台作业控制
Linux bash Shell单一终端界面下,经常需要管理或同时完成多个作业,如一边执行编译,一边实现数据备份,以及执行SQL查询等其他的任务。所有的上述的这些工作可以在一个 bash 内实现,在同一个终端窗口完成。
1、前后台作业的定义
-
前后台作业实际上对应的也就是前后台进程,因此也就有对应的 pid。在这里统称为作业。
-
无论是前台作业还是后台作业,两者都来自当前的Shell,是当前Shell的子程序。
-
前台作业:可以由用户参与交互及控制的作业我们称之为前台作业。
-
后台作业:在内存可以自运行的作业,用户无法参与交互以及使用[ctrl]+c来终止,只能通过bg或fg来调用该作业。
2、几个常用的作业命令
-
command & 直接让作业进入后台运行
-
[ctrl]+z 将当前作业切换到后台
-
jobs 查看后台作业状态
-
fg %n 让后台运行的作业n切换到前台来
-
bg %n 让指定的作业n在后台运行
-
kill %n 移除指定的作业n
- “n” 为jobs命令查看到的job编号,不是进程id。
- 每一个job会有一个对应的job编号,编号在当前的终端从1开始分配。
- job 编号的使用样式为[n],后面可能会跟有 “+” 号或者 “-” 号,或者什么也不跟。
- “+” 号表示最近的一个job,
- “-” 号表示倒数第二个被执行的Job。
- 注,“+” 号与 “-” 号会随着作业的完成或添加而动态发生变化。
-
通过jobs方式来管理作业,当前终端的作业在其他终端不可见。
3、演示后台作业命令
# 直接将作业放入到后台(附加 & 符号)
[[email protected] ~]# sleep 600 &
[1] 12500
[[email protected] ~]# # 此时可进行其它操作,作业一旦完成,会弹出如下的提示
[1]+ Done