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