如何在Bash中使用变量

如果您想编写脚本并了解要从网络上剪切和粘贴的代码将如何对Linux计算机进行操作,则变量至关重要。我们将帮助您入门!

变数101

变量被命名为符号,代表字符串或数字值。当您在命令和表达式中使用它们时,会将它们视为您键入了它们所拥有的值而不是变量名。

要创建变量,只需为其提供名称和值。您的变量名应具有描述性,并提醒您它们所具有的价值。变量名不能以数字开头,也不能包含空格。但是,可以从下划线开始。除此之外,您还可以混合使用大小写字母数字字符。

例子

在这里,我们将创建五个变量。格式是键入名称,等号 =,以及价值。请注意,等号前后没有空格。给变量赋值通常称为 分配 变量的值。

我们将创建四个字符串变量和一个数字变量,今年:

我=戴夫
my_boost = Linux
他=大力水手
his_boost =菠菜
this_year = 2019

要查看变量中保存的值,请使用 回声 命令。您必须在变量名称前加一个美元符号 $ 每当您引用它包含的值时,如下所示:

回声$ my_name
回声$ my_boost
回声$ this_year

让我们一次使用所有变量:

echo“ $ my_boost对$ me,$ his_boost对$ him(c)$ this_year”

变量的值替换其名称。您还可以更改变量的值。要将新值分配给变量,my_boost,只需重复分配第一个值时所做的操作,就像这样:

my_boost =龙舌兰酒

如果重新运行上一个命令,现在将得到不同的结果:

echo“ $ my_boost对$ me,$ his_boost对$ him(c)$ this_year”

因此,如果更改变量中保存的值,则可以使用引用相同变量的相同命令并获得不同的结果。

稍后我们将讨论引用变量。现在,这里要记住一些事情:

  • 单引号中的变量 ' 被视为文字字符串,而不是变量。
  • 引号中的变量 " 被视为变量。
  • 要获取变量中保存的值,您必须提供美元符号 $.
  • 没有美元符号的变量 $ 仅提供变量的名称。

您还可以创建一个变量,该变量从现有变量或变量数量中获取其值。以下命令定义了一个名为 年鉴 并为其分配组合值 my_boost今年 变量:

Drink_of-the_Year =“ $ my_boost $ this_year”
回声年度

如何在脚本中使用变量

没有变量,脚本将完全受阻。变量提供了使脚本成为通用而非特定解决方案的灵活性。为了说明两者之间的区别,以下是一个脚本,该脚本对文件中的文件进行计数 / dev 目录。

将其键入文本文件,然后将其另存为 fcnt.sh (“文件计数”):

#!/ bin / bash folder_to_count = / dev file_count = $(ls $ folder_to_count | wc -l)在$ folder_to_count中回显$ file_count个文件

在运行脚本之前,必须使其成为可执行文件,如下所示:

chmod + x fcnt.sh

输入以下内容以运行脚本:

./fcnt.sh

这会打印出 / dev 目录。运作方式如下:

  • 称为 folder_to_count 被定义,并设置为包含字符串“ / dev”。
  • 另一个变量称为file_count, 被定义为。此变量从命令替换中获取其值。这是括号之间的命令短语 $( )。请注意,有一个美元符号 $ 在第一个括号之前。这个构造 $( ) 计算括号内的命令,然后返回其最终值。在此示例中,该值已分配给 file_count 多变的。至于 file_count 就变量而言,它传递了一个要保留的值;它与如何获得价值无关。
  • 在命令替换中评估的命令将执行 ls 文件列表在目录中 folder_to_count 变量,已设置为“ / dev”。因此,脚本执行命令“ ls / dev”。
  • 该命令的输出通过管道传递到 厕所命令。这 -l (行数)选项的原因厕所 来计算输出中的行数ls 命令。由于每个文件都在单独的行中列出,因此这是“ / dev”目录中文件和子目录的数量。此值已分配给 file_count 多变的。
  • 最后一行使用echo输出结果。

但这仅适用于“ / dev”目录。我们如何使脚本可以在任何目录下工作?它所需要的只是一个小改变。

如何在脚本中使用命令行参数

许多命令,例如 ls厕所,采用命令行参数。这些为命令提供了信息,因此它知道您要执行的操作。如果你想ls 要在主目录上工作并显示隐藏文件,可以使用以下命令,其中波浪号 ~-一种 (全部)选项是命令行参数:

ls〜-a

我们的脚本可以接受命令行参数。它们被称为 $1 对于第一个参数, $2 作为第二个,依此类推,直到 $9 第九个参数。 (实际上,有一个 $0,不过,它始终保留脚本。)

您可以像在常规变量中一样在脚本中引用命令行参数。让我们修改脚本,如下所示,并用新名称保存fcnt2.sh:

#!/ bin / bash folder_to_count = $ 1 file_count = $(ls $ folder_to_count | wc -l)回显$ folder_to_count中的$ file_count个文件

这次, folder_to_count 变量被分配了第一个命令行参数的值, $1.

脚本的其余部分完全像以前一样工作。现在,您的脚本已不再是一个特定的解决方案,而是一个通用的解决方案。您可以在任何目录中使用它,因为它不是硬编码为仅与“ / dev”一起使用。

使脚本可执行的方法如下:

chmod + x fcnt2.sh

现在,尝试一些目录。您可以先执行“ / dev”以确保获得与以前相同的结果。输入以下内容:

./fnct2.sh / dev
./fnct2.sh / etc
./fnct2.sh / bin

您将获得与“ / dev”目录相同的结果(207个文件)。这是令人鼓舞的,您将获得其他每个命令行参数的特定于目录的结果。

为了缩短脚本,您可以省去变量,folder_to_count,总共,只是参考 $1 全文如下:

#!/ bin / bash file_count = $ {ls $ 1 wc -l)echo $ 1中的$ file_count个文件

使用特殊变量

我们提到 $0,该值始终设置为脚本的文件名。这样,即使已重命名,您也可以使用脚本来执行正确打印其名称的操作。这在日志记录情况下很有用,在这种情况下,您想知道添加条目的进程的名称。

以下是其他特殊的预设变量:

  • $#:向该脚本传递了多少个命令行参数。
  • $@:所有传递给脚本的命令行参数。
  • $?:最后运行的进程的退出状态。
  • $$:当前脚本的进程ID(PID)。
  • $ USER:执行脚本的用户的用户名。
  • $ HOSTNAME:运行脚本的计算机的主机名。
  • $ SECONDS:脚本已运行的秒数。
  • $随机:返回一个随机数。
  • $ LINENO:返回脚本的当前行号。

您想在一个脚本中看到所有这些内容,不是吗?你可以!将以下内容另存为一个文本文件,特殊的:

#!/ bin / bash回声“有$#命令行参数”回声“它们是:$ @”回声“参数1是:$ 1”回声“脚本被称为:$ 0”#任何旧进程,以便我们可以报告在退出状态pwd回显“ pwd返回$?” echo“此脚本具有进程ID $$” echo“该脚本由$ USER启动” echo“它在$ HOSTNAME上运行” sleep 3 echo“它已经在$ SECONDS秒内运行” echo“随机数:$ RANDOM”回声“这是脚本的行号$ LINENO”

输入以下内容使其可执行:

chmod + x special.sh

现在,您可以使用许多不同的命令行参数来运行它,如下所示。

环境变量

Bash使用环境变量来定义和记录启动时创建的环境的属性。这些Bash可以轻松访问的保留信息,例如您的用户名,语言环境,历史文件可以保留的命令数,默认编辑器等等。

要查看您的Bash会话中的活动环境变量,请使用以下命令:

env |较少的

如果您在列表中滚动,则可能会发现一些有用的脚本来引用。

如何导出变量

当脚本运行时,它是在自己的进程中,并且在该进程之外看不到它使用的变量。如果要与启动脚本的另一个脚本共享变量,则必须导出该变量。我们将通过两个脚本向您展示如何做到这一点。

首先,使用文件名保存以下内容script_one.sh:

#!/ bin / bash first_var = alpha second_var = bravo#检查它们的值echo“ $ 0:first_var = $ first_var,second_var = $ second_var” export first_var export second_var ./script_two.sh#再次检查其值echo“ $ 0:first_var = $ first_var,second_var = $ second_var“

这将创建两个变量, first_varsecond_var,并分配一些值。它将这些打印到终端窗口,导出变量,并调用 script_two.sh。什么时候 script_two.sh 终止,处理流程返回此脚本,它再次将变量输出到终端窗口。然后,您可以查看它们是否更改。

我们将使用的第二个脚本是 script_two.sh。这是脚本script_one.sh电话。输入以下内容:

#!/ bin / bash#检查其值echo“ $ 0:first_var = $ first_var,second_var = $ second_var”#设置新值first_var = charlie second_var = delta#再次检查其值echo“ $ 0:first_var = $ first_var,second_var = $ second_var”

第二个脚本打印两个变量的值,为它们分配新的值,然后再次打印它们。

要运行这些脚本,必须输入以下内容以使其可执行:

chmod + x script_one.sh chmod + x script_two.sh

现在,键入以下内容以启动 script_one.sh:

./script_one.sh

这是输出告诉我们的:

  • script_one.sh 打印变量的值,即alpha和bravo。
  • script_two.sh 接收变量时,输出变量的值(alpha和bravo)。
  • script_two.sh 将它们更改为charlie和delta。
  • script_one.sh 打印变量的值,它们仍然是alpha和bravo。

在第二个脚本中发生的情况将保留在第二个脚本中。就像变量的副本已发送到第二个脚本一样,但是当该脚本退出时,它们将被丢弃。第一个脚本中的原始变量不会被第二个脚本中的副本所发生的任何更改。

如何引用变量

您可能已经注意到,当脚本引用变量时,它们用引号引起来。 "。这样可以正确引用变量,因此在脚本中执行该行时将使用它们的值。

如果您分配给变量的值包含空格,则将它们分配给变量时,空格必须用引号引起来。这是因为,默认情况下,Bash使用空格作为定界符。

这是一个例子:

site_name =操作方法

Bash将“ Geek”之前的空格视为新命令正在启动的指示。它报告没有这样的命令,并放弃了这一行。 回声 向我们展示了 site_name 变量不包含任何内容,甚至不包含“操作方法”文本。

再次尝试使用该值周围的引号,如下所示:

site_name =“ How-To Geek”

这次,它被识别为单个值,并已正确分配给 site_name 多变的。

回声是你的朋友

习惯于命令替换,引用变量以及记住何时包括美元符号可能需要一些时间。

在按Enter键并执行一行Bash命令之前,请尝试使用 回声 在它前面。这样,您可以确保要发生的事情就是您想要的。您还可以捕获语法中可能犯的任何错误。


$config[zx-auto] not found$config[zx-overlay] not found