4.1 Shell 简介

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 变量 #

定义 #

  • 字母、数字、下划线
  • 不以数字开头

赋值 #

  1. 变量名=变量值
a=123

等号 = 左右两边不能有空格。

  1. 使用 let 为变量赋值
let a=10+20
  1. 将命令赋值给变量
l=ls
  1. 将命令结果赋值给变量,使用 $() 或者使用反引号 ``
c=$(ls -l /etc)
  1. 变量值有空格等特殊字符可以包含在双引号 "" 或单引号 ’’ 中

引用 #

  • ${变量名} 称作对变量的引用。

  • echo ${变量名} 查看变量的值。

  • ${变量名} 在部分情况下可以省略为 $变量名

作用范围 #

变量的作用范围只在自己的 shell 中,子进程或平行 shell 都是不能使用的。

如果想让变量的作用范围 “全局” 生效,可以用 source 或 . 的方式执行:

export 导出也可以让变量 “全局” 生效:

unset 可以删除变量:

a=1
unset a