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
readonly
或 typeset -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 , USERNAME 和 LOGNAME | 连接到会话的用户的名称。 |
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