在您使用的任何编程语言中,变量都是非常重要的概念。 将变量视为内存中存储某种类型数据的容器。 变量的主要目的是存储一个值并在以后访问它以进行处理。 如果您是使用其他编程语言(如 Java、C、C++)的人,您可能会发现变量定义的不同之处,因为 Bash 没有强类型系统。
Bash 处理两种类型的变量。 他们是:
- 用户定义变量 :您创建和操作的变量。
- 环境变量 : 创建和存储 bash 或用于系统/应用程序目的的应用程序。
我们将开始使用用户定义的变量,然后是环境变量。
内容
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
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
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. 值的长度 ($#)
使用 $#
,您可以计算传递的参数总数或计算任何值的长度。 看看下面的例子。 在变量名前加上 #
它将打印值的长度而不是实际值。
$ site_name="OSTechnix"
$ echo ${#site_name}
9
10. 变量范围
了解变量的作用域很重要。 当您在终端中或通过 shell 脚本创建变量时,该变量已绑定并且仅可用于该会话。 你也可以说它是一个局部变量。 如果您尝试从其他会话访问该变量,该变量将不可用。
看看下面的图片,它会让你对发生的事情有一个很好的理解。
- 创建变量
site_name="OSTechnix"
从您当前的 shell 并访问该变量。 - 使用
$$ variable
查看您所在的会话。 - 创建一个新的 bash 通过键入会话
"bash"
. - 尝试访问变量
site_name
从本次会议。 您将获得空输出,这是默认行为 bash. - 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脚本