4.1 Shell 简介 #
Shell 是命令解释器,用于解释用户对操作系统的操作。CentOS7 默认使用的 Shell 是 bash。
Shell 有很多可以再 /etc/shells 文件中查看:
4.1.1 脚本格式 #
UNIX 的哲学:一条命令只做一件事。为了组合命令和多次执行,使用脚本文件来保存需要执行的命令,并赋予该文件执行权限(chmod u+rx filename)。如果是二进制文件只需要一个可执性权限,如果是脚本文件需要可读和可执行权限。
Sha-Bang #
在 shell 脚本中,Sha-Bang(也称为 Shebang 或 Hashbang)是指位于脚本文件的第一行的特殊注释。它的形式是以井号 #
开头,紧随其后是一个叹号 !
,再加上一个可执行程序的路径。
下面是一个典型的 Sha-Bang 行示例:
#!/bin/bash
在上述示例中,#!/bin/bash
是一个 Sha-Bang 行。其中 #!/bin/
是固定的前缀,用于告诉系统该文件是一个可执行文件,接下来的 bash 是解释器的路径,表示使用 Bash 解释器来执行该脚本。
Sha-Bang 行的作用是指定脚本所需的解释器。当在命令行中运行脚本文件时,操作系统会读取脚本文件的第一行,根据其中的 Sha-Bang 行来确定要使用的解释器,并将该解释器用于执行该脚本。
除了 #!/bin/bash
,还可以使用其他解释器路径,如 /bin/sh
、/usr/bin/env python
等,根据脚本的需求选择适当的解释器。
需要注意的是,Sha-Bang 行必须位于脚本文件的第一行,否则它将不会被正确解析。同时,脚本文件需要具有执行权限才能被执行。
4.1.2 不同执行方式 #
脚本的执行方式大致有以下几种:
# bash 执行不需要赋予执行权限
bash ./filename.sh
# 需要有执行权限
./filename.sh
source ./filename.sh
. filename.sh
bash 和 ./ 在执行时会产生一个新的子进程,对当前的环境不会产生影响。
4.1.3 重定向符号 #
一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符。
输入重定向符号 <
read var </path/to/a/file
2>
表示将标准错误输出(stderr)重定向到指定的文件或设备。例如,command 2> error.log
将命令的错误输出重定向到名为 error.log 的文件。
&>
表示将标准输出(stdout)和标准错误输出(stderr)均重定向到指定的文件或设备。例如,command &> output.log
将命令的输出(包括标准输出和错误输出)都重定向到名为 output.log 的文件。
2>
只会重定向标准错误输出(stderr),而标准输出(stdout)仍然会输出到终端。
&>
会同时重定向标准输出和标准错误输出,将它们都输出到指定的文件或设备。
echo 123 > /path/to/a/file
输入和输出重定向组合使用:
cat > /path/to/a/file <<EOF
4.1.4 变量 #
定义 #
- 字母、数字、下划线
- 不以数字开头
赋值 #
- 变量名=变量值
a=123
等号 =
左右两边不能有空格。
- 使用 let 为变量赋值
let a=10+20
- 将命令赋值给变量
l=ls
- 将命令结果赋值给变量,使用 $() 或者使用反引号 ``
c=$(ls -l /etc)
- 变量值有空格等特殊字符可以包含在双引号 "" 或单引号 ’’ 中
引用 #
-
${变量名}
称作对变量的引用。 -
echo ${变量名}
查看变量的值。 -
${变量名}
在部分情况下可以省略为$变量名
作用范围 #
变量的作用范围只在自己的 shell 中,子进程或平行 shell 都是不能使用的。
如果想让变量的作用范围 “全局” 生效,可以用 source 或 .
的方式执行:
export 导出也可以让变量 “全局” 生效:
unset 可以删除变量:
a=1
unset a