在您使用的任何编程语言中,变量都是非常重要的概念。 将变量视为内存中存储某种类型数据的容器。 变量的主要目的是存储一个值并在以后访问它以进行处理。 如果您是使用其他编程语言(如 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
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

9.2. 进程 ID ($$)
使用 $$
运营商,你可以得到 bash 进程标识。 如果您从终端运行它,它将为您提供当前会话的进程 ID。
$ echo $$ 195777 # PROCESS ID OF MY CURRENT TERMINAL SESSION

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 脚本创建变量时,该变量被绑定并且仅可用于该会话。 您也可以将其称为局部变量。 如果您尝试从其他会话访问该变量,该变量将不可用。
看看下面的图片,它会让你很好地理解发生了什么。
- 创建变量
site_name="OSTechnix"
从您当前的外壳程序并访问该变量。 - 使用
$$ variable
查看您在哪个会话中。 - 创建一个新的 bash 通过键入会话
"bash"
. - 尝试访问变量
site_name
从本次会议。 您将得到空输出,这是默认行为 bash. - 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 变量之间的区别