跳至内容

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