如果您想编写脚本并了解您将要从 Web 剪切和粘贴的代码会对您的 Linux 计算机产生什么影响,变量至关重要。我们将帮助您开始!
变量 101
变量是表示字符串或数值的命名符号。在命令和表达式中使用它们时,它们将被视为键入了它们所包含的值而不是变量的名称。
要创建变量,只需为其提供名称和值。您的变量名称应该是描述性的,并提醒您它们所包含的值。变量名称不能以数字开头,也不能包含空格。但是,它可以以下划线开头。除此之外,您还可以使用大小写字母数字字符的任意组合。
Bash 变量示例
在这里,我们将创建五个变量。格式是键入名称、等号和值。请注意,等号之前或之后没有空格。为变量赋值通常称为为变量赋值。=
我们将创建四个字符串变量和一个数值变量,
my_name=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019
若要查看变量中保存的值,请使用该命令。每当引用变量名称包含的值时,都必须在变量名称前面加上美元符号,如下所示:echo$
echo $my_name
echo $my_boost
echo $this_year
让我们一次使用所有变量:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"
变量的值将替换其名称。您还可以更改变量的值。要为变量赋值,只需重复赋值时执行的操作,如下所示:my_boostmy_boost=Tequila
如果重新运行上一个命令,现在会得到不同的结果:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"
因此,您可以使用引用相同变量的相同命令,并在更改变量中保存的值时获得不同的结果。
我们稍后将讨论引用变量。现在,请记住以下几点:
单引号中的变量被视为文本字符串,而不是变量。'
引号中的变量被视为变量。"
要获取变量中保存的值,您必须提供美元符号。$
没有美元符号的变量仅提供变量的名称。$
您还可以创建一个变量,该变量的值取自现有变量或变量数量。以下命令定义一个名为的新变量,并为其分配 和 变量的组合值:drink_of_the_Year,my_boostthis_year
drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year
如何在脚本中使用 Bash 变量
没有变量,脚本将完全被束缚。变量提供了使脚本成为通用解决方案而不是特定解决方案的灵活性。为了说明差异,下面是一个对目录中的文件进行计数的脚本。/dev
在文本文件中键入以下内容,然后将其另存为(对于“文件计数”):fcnt.sh
#!/bin/bashfolder_to_count=/devfile_count=$(ls $folder_to_count | wc -l)echo $file_count files in $folder_to_count
在运行脚本之前,必须使其可执行,如下所示:
chmod +x fcnt.sh
键入以下内容以运行脚本:
./fcnt.sh
这将打印目录中的文件数。以下是它的工作原理:/dev
定义了一个名为的变量,并将其设置为保存字符串“/dev”。folder_to_count
定义了另一个称为 的变量。此变量从命令替换中获取其值。这是括号之间的命令短语。请注意,第一个括号前有一个美元符号。此构造计算括号内的命令,然后返回其最终值。在此示例中,该值分配给变量。就变量而言,它传递了一个要保存的值;它不关心如何获得值。file_count$( )$$( )file_countfile_count
在命令替换中计算的命令在变量中的目录上执行文件列表,该目录已设置为“/dev”。因此,脚本执行命令“ls /dev”。lsfolder_to_count
此命令的输出通过管道传递到命令中。(行计数)选项会导致计算命令输出中的行数。由于每个文件都列在单独的行上,因此这是“/dev”目录中的文件和子目录的计数。此值分配给变量。wc -lwclsfile_count
最后一行使用回显输出结果。
但这仅适用于“/dev”目录。我们如何使脚本适用于任何目录?只需要一个小的改变。
如何在脚本中使用命令行参数
许多命令(如 和)都采用命令行参数。这些为命令提供信息,因此它知道您希望它执行什么操作。如果要处理主目录并显示隐藏文件,可以使用以下命令,其中波浪号和(all)选项是命令行参数:lswcls~-a
ls ~ -a
我们的脚本可以接受命令行参数。它们被引用为第一个参数,作为第二个参数,依此类推,直到第九个参数。(实际上,也有一个 ,但它保留用于始终保存脚本。$1$2$9$0
您可以在脚本中引用命令行参数,就像引用常规变量一样。让我们修改我们的脚本,如下所示,并使用新名称保存它:fcnt2.sh
#!/bin/bashfolder_to_count=$1file_count=$(ls $folder_to_count | wc -l)echo $file_count files in $folder_to_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 $file_count files in $1
使用特殊变量
我们提到了 ,它始终设置为脚本的文件名。这允许您使用脚本执行诸如正确打印其名称之类的操作,即使它已重命名也是如此。这在日志记录情况下很有用,在这种情况下,您想知道添加条目的进程的名称。$0
领取专属 10元无门槛券
私享最新 技术干货