Bash - 使用变量¶

玩家社区27962025-10-18 18:00:27

bash bash 脚本 教育

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!

2024 年 4 月 10 日

作者:Antoine Le Morvan

贡献者:Steven Spencer, Ganna Zhyrnova

PS4装游戏需要多长时间? 详解安装步骤及时间估算
花呗账单怎么删除记录