跳至内容

Bash - 使用变量

在本章中,您将学习如何在 bash 脚本中使用变量。


目标:在本章中,您将学会如何

✔ 存储信息以备后用;
✔ 删除和锁定变量;
✔ 使用环境变量;
✔ 命令替换;

🏁 linux, 脚本, bash, 变量

知识⭐ ⭐
难度⭐

阅读时间:10 分钟


存储信息以备后用

与任何编程语言一样,shell 脚本也使用变量。它们用于将信息存储在内存中,以便在脚本执行过程中按需重用。

当变量接收其内容时,它就会被创建。它一直有效,直到脚本执行结束或脚本作者明确要求。由于脚本是按顺序从头到尾执行的,因此不可能在变量创建之前调用它。

变量的内容可以在脚本执行期间更改,因为变量会一直存在直到脚本结束。如果内容被删除,变量仍然处于活动状态但包含空值。

在 shell 脚本中,变量类型是可能的,但很少使用。变量的内容始终是字符或字符串。

#!/usr/bin/env bash

#
# Author : Rocky Documentation Team
# Date: March 2022
# Version 1.0.0: Save in /root the files passwd, shadow, group, and gshadow
#

# Global variables
FILE1=/etc/passwd
FILE2=/etc/shadow
FILE3=/etc/group
FILE4=/etc/gshadow

# Destination folder
DESTINATION=/root

# Clear the screen
clear

# Launch the backup
echo "Starting the backup of $FILE1, $FILE2, $FILE3, $FILE4 to $DESTINATION:"

cp $FILE1 $FILE2 $FILE3 $FILE4 $DESTINATION

echo "Backup ended!"

此脚本使用变量。变量名必须以字母开头,但可以包含任何字母或数字序列。除了下划线 "_" 之外,不能使用特殊字符。

按照惯例,用户创建的变量名称为小写。名称必须谨慎选择,以免过于含糊或过于复杂。但是,变量可以命名为大写字母,如本例所示,如果它是一个全局变量,不应被程序修改。

字符 = 将内容赋给变量

variable=value
rep_name="/home"

= 符号前后不应有空格。

一旦变量被创建,就可以通过在其前面加上美元符号 $ 来使用它。

file=file_name
touch $file

强烈建议使用引号保护变量,如下面的示例所示

file=file name
touch $file
touch "$file"

由于变量内容包含空格,第一个 touch 将创建 2 个文件,而第二个 touch 将创建一个名称包含空格的文件。

要将变量名与其余文本隔离开,必须使用引号或花括号

file=file_name
touch "$file"1
touch ${file}1

建议系统地使用花括号。

使用单引号会抑制特殊字符的解释。

message="Hello"
echo "This is the content of the variable message: $message"
Here is the content of the variable message: Hello
echo 'Here is the content of the variable message: $message'
Here is the content of the variable message: $message

删除和锁定变量

unset 命令允许删除变量。

示例

name="NAME"
firstname="Firstname"
echo "$name $firstname"
NAME Firstname
unset firstname
echo "$name $firstname"
NAME

readonlytypeset -r 命令用于锁定变量。

示例

name="NAME"
readonly name
name="OTHER NAME"
bash: name: read-only variable
unset name
bash: name: read-only variable

注意

脚本开头的 set -u 将在使用了未声明的变量时停止脚本的执行。

使用环境变量

环境变量系统变量是系统为运行而使用的变量。按照惯例,它们都以大写字母命名。

与其他所有变量一样,它们可以在脚本执行时显示。即使强烈不建议这样做,它们也可以被修改。

env 命令显示所有使用的环境变量。

set 命令显示所有使用的系统变量。

在几十个环境变量中,有几个在 shell 脚本中使用很有意义

变量 描述
HOSTNAME 机器的主机名。
USER, USERNAMELOGNAME 登录会话的用户名。
PATH 查找命令的路径。
PWD 当前目录,每次执行 cd 命令时都会更新。
HOME 登录目录。
$$ 脚本执行的进程 ID。
$? 最后执行命令的返回码。

export 命令允许您导出变量。

变量仅在 shell 脚本进程的环境中有效。为了让脚本的子进程了解变量及其内容,必须将其导出。

在子进程中导出的变量的修改无法追溯到父进程。

注意

在没有任何选项的情况下,export 命令会在环境中显示已导出变量的名称和值。

命令替换

可以将命令的结果存储在变量中。

注意

此操作仅对执行结束时返回消息的命令有效。

子执行命令的语法如下

variable=`command`
variable=$(command) # Preferred syntax

示例

day=`date +%d`
homedir=$(pwd)

根据我们刚才学到的所有知识,我们的备份脚本可能如下所示

#!/usr/bin/env bash

#
# Author : Rocky Documentation Team
# Date: March 2022
# Version 1.0.0: Save in /root the files passwd, shadow, group, and gshadow
# Version 1.0.1: Adding what we learned about variables
#

# Global variables
FILE1=/etc/passwd
FILE2=/etc/shadow
FILE3=/etc/group
FILE4=/etc/gshadow

# Destination folder
DESTINATION=/root

## Readonly variables
readonly FILE1 FILE2 FILE3 FILE4 DESTINATION

# A folder name with the day's number
dir="backup-$(date +%j)"

# Clear the screen
clear

# Launch the backup
echo "****************************************************************"
echo "     Backup Script - Backup on ${HOSTNAME}                      "
echo "****************************************************************"
echo "The backup will be made in the folder ${dir}."
echo "Creating the directory..."
mkdir -p ${DESTINATION}/${dir}

echo "Starting the backup of ${FILE1}, ${FILE2}, ${FILE3}, ${FILE4} to ${DESTINATION}/${dir}:"

cp ${FILE1} ${FILE2} ${FILE3} ${FILE4} ${DESTINATION}/${dir}

echo "Backup ended!"

# The backup is noted in the system event log:
logger "Backup of system files by ${USER} on ${HOSTNAME} in the folder ${DESTINATION}/${dir}."

运行我们的备份脚本

sudo ./backup.sh

将得到

****************************************************************
     Backup Script - Backup on desktop                      
****************************************************************
The backup will be made in the folder backup-088.
Creating the directory...
Starting the backup of /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow to /root/backup-088:
Backup ended!

作者:Antoine Le Morvan

贡献者:Steven Spencer, Ganna Zhyrnova