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

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

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

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

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

1.如何创建变量

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

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

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

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

变量命名约定是有争议的,因为我看到不同的人使用不同的约定来创建变量名。 一些使用蛇案例创建用户定义的变量,就像我在前面创建的一样 example 并且有些创建带有全大写的变量名。 没有严格的规定 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
访问声明命令的帮助访问声明命令的帮助

为了 example如果你想用 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 command 是一种操作变量属性的方法,但不要指望强大的类型系统 declare 命令与其他编程语言一样。

5.命令输出到变量

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

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

6. 使用带变量的引号

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

看看下面 example. 我创建了一个名为 "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。 值的长度 ($#)

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

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

10. 变量范围

了解变量的范围很重要。 当您在终端或通过 shell 脚本创建变量时,该变量被绑定并且仅可用于该会话。 您也可以将其称为局部变量。 如果您尝试从其他会话访问该变量,该变量将不可用。

看看下面的图片,它会让你很好地理解发生了什么。

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

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

$ site_name="OSTechnix"
$ export site_name

或者

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

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

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

11.环境变量

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

为了 example, 纳米 设置为默认编辑器进行编辑 crontab. 如果我想使用 维姆 而不是纳米,我可以设置 编辑环境 variable 和 crontab 将检查这个环境变量并使用它。

$ export 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 变量之间的区别