个人简约网站模板免费下载wordpress全站ajax
概览
在上一节中我们了解了关于 Shell 的执行流程,知道了在 Linux 环境中一般有哪些常用的 Shell。而在本节中,将会学习到 Linux 中最常见的一个 Shell —— Bash,了解到 bash 的相关知识和用法。
 
本节目录
- 概览
 - 相关知识
 - bash 命令提示符
 - bash 基本格式
 
- bash 常用特殊符号
 - 特殊字符:
 - 通配符:
 - 逻辑运算符:
 - 重定向符:
 - 命令替换符:
 - 变量和环境符:
 - 引号符:
 - 其他符号:
 
- bash 有哪些常用配置文件
 - 可能常用的系统级配置文件:
 - 可能常用的用户级配置文件:
 - bash 的配置文件加载顺序:
 
- bash 内建命令
 - 几个常用的内建命令
 
相关知识
在上一节中说到,bash 是 sh 的拓展集,除开一些特殊情况,它差不多完全兼容 sh,所以说 bash 也是众多 Linux 发行版中默认使用最多的 Shell。
bash 命令提示符
[iris@localhost ~]$
 
- iris:登录到当前终端的用户名称。
 - localhost:当前计算机的主机名称。
 - ~:当前用户所在的目录,在此处表示的是用户所在的家目录。
 - $:当前用户的级别,在此处表示当前用户为普通用户,# 表示超级用户。
 
在非特殊情况下,我们并不推荐你使用超级用户来管理你的计算机,必要情况下可以使用 sudo 来暂时切换到超级用户权限来管理计算机,这将会在后面说到。
bash 基本格式
[iris@localhost ~]$ 命令 [OP] [ARG]
 
- 命令:指定要执行的操作。例如:ls、cd、echo 等。
 - OP:命令选项,用于修改命令的行为,通常以单个短划线(-)或双短划线(–)开头;如 ls -l 或 ls --all。
 - ARG:命令需要操作的对象,例如文件或目录名称;如 ls -l /usr。
 
bash 常用特殊符号
所有的特殊符号在后面的所有章节中都会提到
特殊字符:
| 符号 | 含义 | 示例 | 
|---|---|---|
| \ | 转义字符,用于转义特殊字符 | echo $HOME | 
| # | 注释符,一般用于在bash 脚本中注释文字 | # this is note | 
| ~ | 主目录符,表示当前用户家目录 | ls ~ | 
| . | 一个点表示当前目录 | ls . | 
| … | 两个点表示上一级目录 | cd … | 
| - | 表示上一次所在的目录 | cd - | 
| & | 将命令置于后台运行 | sleep 5 & | 
通配符:
| 符号 | 含义 | 示例 | 
|---|---|---|
| * | 匹配 >= 0 个的任意字符 | ls *.txt | 
| ? | 匹配任意 1 个字符 | ls file?.txt | 
| + | 匹配任意字符至少 1 个 | echo “abc123” | grep -E “[a-z]+” | 
| [ ] | 匹配括号中的任意一个字符或者一个范围。如 [a-z] 匹配所有小写字母;[2,e,4] 只能匹配 2、e、4 三个字符;可以与符号 ! 联合使用,[!0-9] 匹配除数字之外的任意字符 | ls file[1-3].txt 匹配以 1、2、3任意一个字符结尾的 txt 文件 | 
| { } | 扩展或者枚举括号中每一个字符 | ls -l {a,c,d} 只查看括号中规定的目录 | 
逻辑运算符:
| 符号 | 含义 | 示例 | 
|---|---|---|
| && | 逻辑与,前一个命令成功后执行后一个命令,不会忽略返回值,成功True、失败False | mkdir test && cd test | 
| || | 逻辑或,无论前一个命令是否成功,不会忽略返回值 | cat txt || touch txt | 
| ! | 用于执行历史中的命令;也是逻辑非运算 | ! 3 ,执行 history 中的第三条命令 | 
| ; | 顺序执行,无论前一个命令是否成功,会忽略返回值 | mkdir test; cd test | 
重定向符:
| 符号 | 含义 | 示例 | 
|---|---|---|
| > | 输出重定向,将覆盖文件 | echo “Hello” > file.txt | 
| >> | 输出重定向,追加内容到文件 | echo “Hello” >> file.txt | 
| < | 输入重定向,从文件中读取 | wc -l < file.txt | 
| 2> | 错误输出重定向到文件 | ls /invalid-dir 2> error.log | 
| &> | 标准输出和错误输出同时重定向到文件 | command &> output.txt | 
| << | Here Document,用于多行输入 | cat << EOF | 
| | | 管道符,将前一命令的输出作为后一命令的输入 | cat file.txt | grep Hello | 
命令替换符:
| 符号 | 含义 | 示例 | 
|---|---|---|
| ` ` | 使用反引号执行命令并返回结果 | echo `date` | 
| $(cmd) | 与反引号功能相同,但更推荐使用 | echo $(date) | 
变量和环境符:
| 符号 | 含义 | 示例 | 
|---|---|---|
| $ | 引用变量值 | echo $HOME | 
| ${} | 用于更复杂的变量操作或避免歧义 | echo ${USER} | 
| $n | 获取命令行传递的第 n 个参数,第 0 个参数为命令本身 | echo $1 | 
| $@ | 获取所有参数,将每个参数视为一个独立单元 | echo $@ | 
| $* | 获取所有参数,将所有参数视为一个整体,当作一个字符串 | echo $* | 
| $# | 脚本中传递的参数总个数 | echo $# | 
| $? | 获取上一个命令的退出状态码 | echo $? | 
| $$ | 当前进程的 PID | echo $$ | 
| $! | 最近运行的后台任务的 PID | echo $! | 
更多与 bash shell 编程有关的符号将在后面陆续说到
引号符:
| 符号 | 含义 | 示例 | 
|---|---|---|
| ’ | 单引号,原样输出,变量和特殊字符无效 | echo ‘$HOME’ | 
| " | 双引号,支持变量替换和转义字符 | echo “Home: $HOME” | 
| ` | 引号,命令替换 | echo date | 
其他符号:
| 符号 | 含义 | 示例 | 
|---|---|---|
| () | 分组,用于控制命令优先级;用于运算 | (cd /tmp && ls) | 
| : | 空操作,始终返回成功 | : | 
| !! | 执行上一条命令 | !! | 
| !* | 获取上一条命令的所有参数 | !* | 
还有众多作者未曾使用过的特殊符号,欢迎有人在评论区指正
bash 有哪些常用配置文件
可能常用的系统级配置文件:
- /etc/profile:是系统级的环境变量和启动配置文件,它适用于所有用户的登录 Shell 会话(仅适用于登录 shell)。它在用户登录时被执行,一般用它来设置全局环境变量或者执行其他全局脚本文件。
 - /etc/profile.d/:额外的环境变量或启动脚本,所有用户生效。
 - /etc/bashrc 或 /etc/bash.bashrc:是系统级的 Bash 配置文件,用于为所有用户的非登录 Shell 提供全局配置。
 - /etc/bash_completion.d: Bash 自动补全(tab 补全) 的扩展目录,存放特定命令的补全脚本。当启用了 Bash 补全功能时,该目录下的脚本会自动加载,并为对应的命令提供 Tab 键补全。(通常可以安装 bash-completion 工具包或手动添加补全脚本)。关于此用法将在文章最后的附录部分进行介绍。
 - /etc/skel/:是 Linux 系统中的“用户模板目录”,用于存放新用户的默认配置文件。当创建新用户时(使用 useradd 命令),系统会自动复制 skel 目录中的所有文件到新用户的 home 目录。也用于初始化新用户的 Shell 环境,避免每次创建用户都手动配置 .bashrc、.profile 等。
 
可能常用的用户级配置文件:
- ~/.bashrc:非登录 Shell 配置。
 - ~/.bash_profile:登录 Shell 配置。
 - ~/.profile:兼容 sh 脚本的用户级登录 Shell 配置。
 - ~/.bash_logout:登出Bash 会话时执行。
 
注意:这些配置文件会随时随着系统版本的变化而变化,但大致作用不会做出大的改变。(如 ~/.profile 在最新的 RHEL9 中就默认不存在,但是如果手动创建它,那它将仍然是一个有效的配置文件)
bash 的配置文件加载顺序:
- 对于登录 shell 的加载顺序: 
- 加载全局配置:/etc/profile、/etc/profile.d/*.sh(由 /etc/profile 加载)
 - 加载用户级配置:~/.bash_profile: 
- 若 ~/.bash_profile 文件不存在:尝试加载 ~/.bash_login: 
- 若 ~/.bash_login 也不存在,则加载 ~/.profile
 
 
 - 若 ~/.bash_profile 文件不存在:尝试加载 ~/.bash_login: 
 - 若 ~/.bash_profile 里有 source ~/.bashrc,则继续加载 ~/.bashrc
 - 登出时加载:~/.bash_logout
 
 - 对于非登录 shell 的加载顺序: 
- 加载系统级配置文件:/etc/bashrc(RHEL系列);/etc/bash.bashrc (Debian/Ubuntu等系列)
 - 加载用户级配置文件:~/.bashrc
 
 
bash 内建命令
bash 内建命令是 bash 自带的命令,它们不依赖于 /usr/bin/ 或其他外部程序,因此执行速度更快,并且即使 /usr/bin/ 不可用,它们仍然可以运行。
[root@localhost ~]# type logout			# 查看单个命令是不是 bash 内建命令,type本身也是内建命令
logout 是 shell 内建
[root@localhost ~]# compgen -b			# 查看 bash 包含的所有内建命令,或使用 help 查看所有内建命令及其语法
.
:
alias
bg
...
 
几个常用的内建命令
内建命令 cd:
[root@localhost ~]# ls
公共  模板  视频  图片  文档  下载  音乐  桌面  anaconda-ks.cfg
[root@localhost ~]# cd /usr				# 去往各个目录
[root@localhost usr]# ls
bin  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
 
内建命令 history、fc:
[root@localhost ~]# history 			# 显示所有历史执行过的命令1  ip a2  ping baidu.com....117  ls118  history 
[root@localhost ~]# fc 117		# 编辑并重新执行对应编号的历史命令,将 ls 重新编辑为 ls -l 执行。(!117 只是执行对应编号的命令)
ls -l
总用量 8
-rw-r--r--. 1 root root   2  2月 12 13:00 1
drwxr-xr-x. 2 root root   6  1月 18 10:47 公共
 
内建命令 alias、unalias:
[root@localhost ~]# la
bash: la: command not found...
[root@localhost ~]# alias la="ls -a"		# 给一些命令设置临时别名,也可以写入.bashrc等预加载脚本中永久生效
[root@localhost ~]# la
.   公共  视频  文档  音乐  anaconda-ks.cfg  .bash_logout   .bashrc  .config  .local    .tcshrc
..  模板  图片  下载  桌面  .bash_history    .bash_profile  .cache   .cshrc   .mozilla
[root@localhost ~]# unalias la				# 反过来也可以去取消别名
[root@localhost ~]# la
bash: la: command not found...
 
内建命令 logout、exit:
[root@localhost ~]# logout 			# 退出登录 Shell(适用于 SSH 或终端)SSH  192.168.0.100: session closed
按任意键重新连接
[root@localhost ~]# exit 			# 退出当前 Shell,并返回退出代码
 
内建命令dirs、pwd:
[root@localhost ~]# cd /usr/share/
[root@localhost share]# dirs		# 显示当前目录栈
/usr/share
[root@localhost share]# pwd			# 一样的功能
/usr/share
 
内建命令 jobs、fg、bg:
[root@localhost share]# sleep 100 &
[1] 2704
[root@localhost share]# jobs			# 查看所有后台作业
[1]+  运行中               sleep 100 &
[root@localhost share]# fg				# 将后台作业调度到前台执行
sleep 100
[root@localhost share]# bg				# 将后台已暂停的作业恢复到后台执行
 
内建命令 disown、kill:
[root@localhost ~]# sleep 1000 &
[1] 2720
[root@localhost ~]# jobs
[1]+  运行中               sleep 1000 &
[root@localhost ~]# disown 			# 让已经存在的任务脱离当前终端运行,当关闭终端时,此任务将不会受到任何影响
[root@localhost ~]# jobs
[root@localhost ~]# 
[root@localhost ~]# ps aux | grep sleep		# 任务已脱离终端运行
root        2720  0.0  0.0 220956  1024 pts/0    S    12:50   0:00 sleep 1000
root        2724  0.0  0.0 221684  2484 pts/0    S+   12:52   0:00 grep --color=auto sleep
[root@localhost ~]# kill -9 2720		# 杀死任务id为 2720 的任务
[root@localhost ~]# ps aux | grep sleep
root        2727  0.0  0.0 221684  2428 pts/0    S+   12:55   0:00 grep --color=auto sleep
 
其他常用内建命令将在 shell 编程中提到
