Bash 脚本——用例子解释变量

在您使用的任何编程语言中,变量都是非常重要的概念。 将变量视为内存中存储某种类型数据的容器。 变量的主要目的是存储一个值并在以后访问它以进行处理。 如果您是使用其他编程语言(如 Java、C、C++)的人,您可能会发现变量定义的不同之处,因为 Bash 没有强类型系统。

Bash 处理两种类型的变量。 他们是:

  • 用户定义变量 :您创建和操作的变量。
  • 环境变量 : 创建和存储 bash 或用于系统/应用程序目的的应用程序。

我们将开始使用用户定义的变量,然后是环境变量。

内容

  1. 1.如何创建变量
  2. 2. 如何访问 Bash 变量
  3. 3. 给变量重新赋值
  4. 4. 声明变量的数据类型
  5. 5. 命令输出到变量
  6. 6. 使用带变量的引号
  7. 7. 移除变量
  8. 8.只读变量
  9. 9. Bash 内置特殊变量
    1. 9.1. Exit 状态($?)
    2. 9.2. 进程 ID ($$)
    3. 9.3. 脚本名称和参数($0-$9)
    4. 9.4. 值的长度 ($#)
  10. 10. 变量范围
  11. 11.环境变量
  12. 结论

1.如何创建变量

变量应该有一个标识符(变量名)和一个分配给它的值,如下所示。 标识符(变量名)是 "site_name" 分配的值是 "OSTechnix".

$ site_name="OSTechnix" $ this_year=2021 $ value_of_pi=3.14

创建变量时需要记住的事情很少。

  • 变量名和值之间不应有空格。
  • 尽量避免使用已经使用过的名称,例如 reserved bash 会产生冲突的关键字、变量和函数名称。
  • 创建描述性变量名,变量名可以包含字母、数字、下划线和数字。

变量命名约定是有争议的,因为我看到不同的人使用不同的约定来创建变量名。 有些使用蛇形大小写创建用户定义的变量,就像我在前面的示例中创建的那样,有些创建带有完整大写的变量名称。 没有严格的规定 bash 但要 持续的 使用您选择的任何方法。 我更喜欢将我的变量命名为蛇形,并将常量命名为大写。

2. 如何访问 Bash 变量

有两种方法可以访问变量。 一种是使用 "$ symbol" 后跟变量名,第二种方法是使用 "$ symbol" 后跟花括号和花括号内的变量名。

$ echo $site_name
OSTechnix
$ echo ${this_year} 2021
$ echo ${this_year} $value_of_pi
2021 3.14
访问 Bash 变量

3. 给变量重新赋值

Bash 没有强类型系统,这意味着在创建变量时定义数据类型没有严格的规则。 Bash 变量将所有值存储为字符串,它很聪明地知道我们何时进行数值计算。

您可以将任何值重新分配给已创建的变量。

$ os_name="PoP_OS!"
$ echo ${os_name} PoP_OS!
$ os_name="Linux Mint" $ echo ${os_name} Linux Mint
给变量重新赋值

4. 声明变量的数据类型

您可以使用 declare 命令来创建具有特定数据类型的变量。 访问帮助部分 declare 命令以了解更多信息。

$ declare --help
访问声明命令的帮助访问声明命令的帮助

例如,如果您希望创建一个变量 int 数据类型,您可以使用 declare 命令与 -i 旗帜。

$ declare -i pi
$ pi=3
$ echo $pi 3
$ pi=3.14 bash: 3.14: syntax error: invalid arithmetic operator (error token is ".14")
声明变量的数据类型声明变量的数据类型

请记住,该 declare 命令是一种操作变量属性的方法,但不要指望从 declare 命令与其他编程语言一样。

5. 命令输出到变量

你可以运行任何 bash 命令并将命令的输出存储到变量中。 您必须在其中运行命令 $() 如下所示,稍后使用该变量进行进一步处理。

$ today_date=$(date)
$ echo ${today_date} Saturday 11 September 2021 08:53:25 PM IST
将输出存储到变量将输出存储到变量

6. 使用带变量的引号

在 bash, 单引号和双引号有两种不同的表现。 单引号将阻止扩展并将值视为文字。 双引号将允许扩展。

看看下面的例子。 我创建了一个名为的变量 "which_year" 并与字符串一起运行命令。 当我使用双引号时 date 命令将被扩展,但当使用单引号时 date 命令将不会运行并按原样存储在变量中。

$ which_year="I am in year : $(date +%Y)" $ echo ${which_year} I am in year : 2021
$ which_year="I am in year : $(date +%Y)" $ echo ${which_year} I am in year : $(date +%Y)'
变量中的单引号和双引号行为变量中的单引号和双引号行为

7. 移除变量

您可以使用 unset 命令。

Unset 命令删除变量和函数的值和属性。

您可以使用 unset-v 指向变量的标志或只是 unset 默认情况下,该命令首先检查变量定义并取消设置。

$ echo ${which_year}
$ unset -v which_year (or) unset which_year
$ echo ${which_year}
未设置变量未设置变量

有关更多详细信息,请参阅 unset 命令帮助部分。

$ unset --help

8.只读变量

只读状态意味着一旦创建变量,您就无法更改该值或删除该变量。 有两种方法可以创建只读变量。

用 bash 内置 readonly 创建只读变量。

$ readonly var1="This is a readonly variable"

或者,您可以使用 declare 命令与 -r 旗帜。

$ declare -r var2="This is a readonly variable too"

您不能重新分配或取消设置 readonly 变量值,它会抛出错误。

$ var2="Reassigning with new value" bash: var2: readonly variable
$ unset var1 bash: unset: var1: cannot unset: readonly variable
只读变量只读变量

9. Bash 内置特殊变量

Bash 有一些专门用于存储某些结果的特殊内置变量。 看看下面的变量列表。

$? = Stores exit status of last ran the command. $$ = Stores process ID for your bash session. $0 = Script name. $1 .. $9 = Arguments passed to the script. $# = Count the length of values [email protected], $* = Stores array of all values.

9.1. Exit 状态($?)

您运行的每个 Linux 命令都有一个关联的退出代码(0-255)。 零点代表成功,其余的点代表失败,含义不同。

$ whoami
$ echo $?
0
$ asdf # WRONG COMMAND
$ echo $?
127
Exit  状态码Exit 状态码

9.2. 进程 ID ($$)

使用 $$ 运营商,你可以得到 bash 进程标识。 如果您从终端运行它,它将为您提供当前会话的进程 ID。

$ echo $$ 195777 # PROCESS ID OF MY CURRENT TERMINAL SESSION
Bash 进程 IDBash 进程 ID

9.3. 脚本名称和参数($0-$9)

参数可以传递给您的脚本,您可能已经在日常生活中使用过它们。 看看 id 接受用户名作为参数的命令。

$ id karthick
uid=1000(karthick) gid=1000(karthick) groups=1000(karthick),4(adm),27(sudo),119(lpadmin),998(docker)

同样,您可以创建接受参数的脚本。 创建一个示例 shell 脚本并在其中复制/粘贴以下代码段。

cat > main.sh #!/bin/bash  echo "+ script_name=$0 " echo "+ first_argument=$1 " echo "+ second_argument=$2 " echo "+ third_argument=$3 "

现在运行脚本并传递参数。 我将 1 到 3 作为参数传递。 $0 使用绝对路径获取脚本名称,因为我通过了绝对路径并且 $1$3 分配有各自传递的参数。

$ /home/karthick/main.sh 1 2 3 + script_name=/home/karthick/main.sh  + first_argument=1  + second_argument=2  + third_argument=3 
传递给脚本的参数传递给脚本的参数

9.4. 值的长度 ($#)

使用 $#,您可以计算传递的参数总数或计算任何值的长度。 看看下面的例子。 在变量名前加上 # 它将打印值的长度而不是实际值。

$ site_name="OSTechnix"
$ echo ${#site_name}
9
字符串长度字符串长度

10. 变量范围

了解变量的作用域很重要。 当您在终端中或通过 shell 脚本创建变量时,该变量已绑定并且仅可用于该会话。 你也可以说它是一个局部变量。 如果您尝试从其他会话访问该变量,该变量将不可用。

看看下面的图片,它会让你对发生的事情有一个很好的理解。

  1. 创建变量 site_name="OSTechnix" 从您当前的 shell 并访问该变量。
  2. 使用 $$ variable 查看您所在的会话。
  3. 创建一个新的 bash 通过键入会话 "bash".
  4. 尝试访问变量 site_name 从本次会议。 您将获得空输出,这是默认行为 bash.
  5. Exit 通过键入新会话 "Exit" 现在尝试访问该变量,您将能够访问该变量。
变量范围变量范围

如果您希望从任何会话全局访问变量,则必须使用 命令将使变量可以在从当前会话创建的所有子会话/进程中访问。

$ site_name="OSTechnix"
$ site_name

或者

$  site_name="OSTechnix"
$ bash
$ echo ${site_name}
导出变量导出变量

您可以通过键入来获取要导出的变量列表 "" 从终端。 您将获得环境和用户定义的变量列表。

$ 
导出变量列表导出变量列表

11.环境变量

到目前为止,我们已经看到了如何使用用户定义的变量。 在介绍部分,我提到 bash 支持环境变量。 这组变量将在您启动时加载 bash 会话,它们由维护 bash. 应用程序使用这些环境变量来决定行为。

例如, 纳米 设置为默认编辑器进行编辑 定时任务表. 如果我想使用 维姆 而不是纳米,我可以设置 编辑器环境 variable 和 crontab 将检查此环境变量并使用它。

$  EDITOR="vim"
$ crontab -e

当心: 您的变量仅绑定到您当前的会话。 如果你想让它持久化,你必须把它放进去 ~/.bashrc 或者 ~/.bash_profile.

您可以通过运行以下命令获取环境变量列表 "printenv" 命令。 您将看到环境变量是用大写字母定义的。

$ printenv
打印环境打印环境

您还可以使用 printenv 命令访问特定的环境变量。 以下是您将遇到的一些常见环境变量。

$ printenv USER # PRINTS USER NAME
karthick
$ printenv HOME # USER HOME DIRECTORY LOCATION
/home/karthick
$ printenv PWD # PRESSENT WORKING DIRECTORY
/home/karthick
$ printenv SHELL # WHICH SHELL I AM USING NOW
/bin/bash
$ printenv PATH # PATH WHICH IS USED BY BASH TO CHECK AND RUN COMMANDS
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
打印重要的环境变量打印重要的环境变量

结论

在这个 Bash 变量指南中,我们首先简要介绍了变量以及如何在它们各自的部分中创建、访问、更改和取消设置。 然后我们已经看到了用户定义变量和环境变量之间的区别。 尝试探索在您的会话中加载的环境变量列表,这将使您对 Bash 有一个很好的理解。

相关阅读:

  • Bash 脚本——For 循环用例子解释
  • Bash 脚本——用例子解释 While 和 until 循环
  • Bash 脚本——用例子解释函数
  • 用 Linux 中的示例解释 Bash Echo 命令
  • Bash Heredoc 初学者教程
  • 用例子解释 Bash 重定向
  • 定义带导出和不带导出的 Bash 变量的区别

BASHBash 脚本Bash shellBash 提示Bash 变量CLI命令行Linux脚本