Bash变量

变量是编程的重要组成部分,或者说它们是编程语言的精神。变量通过字符,数字和字母数字指定内存位置。它们通常在计算机程序中被引用和操纵。

1. 变量是什么?

变量是将数据或有用的信息作为值存储的容器。以下是变量的语法:

variable_name =value

变量是两个单词的组合形式,即variable+value,变量的值可以更改,并且可以多次使用。
变量是任何类型的数据(例如整数,浮点数,字符等)的临时存储。变量名可以包含字母,数字和下划线,并且其名称只能以字母和下划线开头。

注意:不能定义以任何数字开头的变量名称。

2. Bash变量

如果没有适当的信息(语法,数据类型,类型,工作方式),我们将无法使用bash变量,因此,通过浏览此简短教程,以获取有关Bash变量的适当概述。

首先,了解语法:

Variable_name=value

定义Bash变量的规则集:

  • 在读取或打印变量时,在变量名前加上美元($)符号。
  • 设置任何值的变量时,省略美元符号($)。
  • 变量名可以是字母数字,也可以用下划线(_)书写。
  • 变量名称区分大小写:xX视为两个不同的变量。
  • 变量名可以使用大写或小写字母或两者的混合形式编写。
  • 变量可以放在Bash脚本中的任何地方或命令行中,因为在运行时,Bash会将其替换为其分配的值。
  • 变量名称与值之间的等号(=)的两侧都不应有空格。以下是无效变量的一些示例,它们之间具有空格(由点...表示),如下所示:
    var1=...variable1
    var2...=variable2
    var3...=...variable3
    
  • 不需要使用任何单引号或双引号来定义具有单个字符值的变量,例如var1=variable。要将多个单词或字符串作为单个项输入到变量中,然后使用引号将内容包含在该变量中。
    • 单引号('')有助于处理每个字符。
    • 双引号("")有助于进行替换。

2. 数据类型

在正式的编程语言中,必须在变量声明时定义变量的数据类型。例如:

int year=2012  
char comp_name='yizhi'

但是对于Bash,不必在变量声明时定义变量的数据类型。Bash变量是无类型的,只需通过分配其值来键入变量名称,它会自动判断数据类型。

如果将数字值分配给变量,它将自动转为整数工作,如果将字符值分配给该变量,则它将转为字符串类型。

year=2012  
comp_name=zyiz

使用echo命令,通过在名称之前加上美元($)号来读取它们,例如:

echo $year
echo $name

3. Bash变量类型

Shell或UNIX系统中都有两种类型的变量。

  • 系统定义的变量
  • 用户定义的变量

3.1.系统定义的变量

这些变量是由LINUX操作系统本身创建和维护的预定义变量。它们的标准约定是通常以大写字母进行定义。因此,每当看到以大写字母定义的变量时,很可能它们就是系统定义的变量。

这些是以下系统定义的变量,如下所示:

1.BASH表示Shell名称。

示例:

BASH=/usr/bin/bash

2.BASH_VERSION指定Bash持有的shell版本。

示例:

BASH_VERSION=4.2.46(2)

3.COLUMNS指定编号,屏幕的列数。

示例:

COLUMNS=80

4.HOME为用户指定主目录。
示例:

HOME=/home/zyiz

5.LOGNAME指定日志记录用户名。

示例:

LOGNAME=zyiz

6.OSTYPE指示操作系统的类型。

示例:

OSTYPE=linux-gnu

7.PWD代表当前的工作目录。

示例:

PWD=/home/maxsu

8.USERNAME指定当前登录用户的名称。

示例:

USERNAME=maxsu

要了解系统中这些变量的列表,请在命令行终端上键入命令setenvprintenv,如下所示:

  1. 键入set命令。
    set命令
  1. 键入env命令。
    env命令

  2. 键入printenv命令。
    printenv命令

下面演示如何通过Bash Shell调用这些变量。参考以下步骤:

第1步:创建一个脚本文件:bash_sdvar.sh,并在Bash控制台上编写以下代码,如下所示:

#! /bin/bash  
# Bash System-defined Variables  
echo $HOME # Home Directory  
echo $PWD # current working directory  
echo $BASH # Bash shell name  
echo $BASH_VERSION # Bash shell Version  
echo $LOGNAME # Name of the Login User  
echo $OSTYPE # Type of OS

第2步:保存并执行脚本,它将显示输出,如下图所示:

3.2. 用户定义的变量

这些变量由用户创建和维护。通常,这些类型的变量以小写形式定义。但是不强制的,也可以将变量名称写成大写。

下面通过创建一个Bash脚本来定义一些变量,请按照以下步骤进行操作:

第1步:创建一个脚本文件:bash_udvar.sh,并在Bash控制台上键入以下代码:

#! /bin/bash  
# User-Defined Variables   
name=Maxsu  
ROLL_NO=525323  
echo "The student name is $name and his Roll number is $ROLL_NO."

第2步:保存代码文件,执行得到以下结果:
用户定义的变量

4. Bash变量使用

在基本演示了变量之后,接下来我们开始了解如何使用它们。

通常对Bash中的变量执行两个操作,如下所示:

  • 为变量设置值。
  • 读取变量的值。

设置变量值有几种方式,其中最常见的方法是直接设置值。要读取变量,可以在脚本中的任何位置放置变量名称(注意:以$符号开头后加上变量名称)。

Bash首先检查所有变量名,就像它们在脚本中一样。然后,它将解释脚本的每一行。识别每个变量后,它将用分配的值替换每个变量名。它解释/运行每一行代码,并针对脚本的每个编码行继续执行此过程。

注:Bash中的两种变量都可以在终端以及Bash脚本上使用。下面通过一个简单的示例了解它们如何在终端和Bash上的工作。

示例:通过调用用户名,显示用户当前工作的位置以及使用的Bash Shell版本。

4.1. 在终端上工作

在终端上工作

4.2. 在Bash Shell上工作

请参见下面给出的脚本:bash-var.sh,代码如下:

#!/bin/bash
# Bash Variables
USER_NAME=maxsu
echo Hey there! maxsu is any user curently working on he directory $PWD with the Bash Shell Version $BASH_VERSION.

在脚本的第三行,声明了一个变量USER_NAME来存储用户名,值是:maxsu。在最后两行中,使用echo命令打印消息。此消息中有两个变量和一个命令,每个变量前面都有美元($)符号,其中:

  • USER_NAME是用户定义的变量,用于调用用户名的值。
  • BASH_VERSION是系统定义的变量,shell会自行调用。它用于打印Bash Shell的版本,
  • PWD命令用于打印用户的当前位置。

接下来,执行上面脚本:bash-var.sh,得到以下结果:

在终端和Bash Shell上还有一些练习使用变量的示例。通过遵循规则集(前面讨论过),对变量进行如下练习:

A.使用命令行终端

1.设置变量
设置变量

2.读取和引用变量
读取和引用变量

3.无效的变量

maxsu@ubuntu:~$ bvar = value-2

Command 'bvar' not found, did you mean:

  command 'bear' from deb bear
  command 'bar' from deb bar

Try: sudo apt install <deb name>

maxsu@ubuntu:~$ bvar =value-2

Command 'bvar' not found, did you mean:

  command 'bar' from deb bar
  command 'bear' from deb bear

Try: sudo apt install <deb name>

maxsu@ubuntu:~$ bvar=value of var
of: command not found
maxsu@ubuntu:~$

4.结合两个字符串变量
结合两个以上变量

5.用变量连接字符串
用变量连接字符串

注:不要使用单引号来组合两个变量,也不要将字符串与变量串联。如果通过将字符串括在单引号中来连接字符串,那么将无法读取它们,如下面的图像所示:

B.使用Bash脚本:

下面是组合字符串变量的示例。将下面代码保存到文件:bash-svar.sh

#!/bin/bash
# 结合两个字符串变量
str_var1="My name is:"
str_var2="Maxsu"
str_var3="Haikou"
echo "$str_var1: $str_var2, come from $str_var2"

执行上面示例代码,得到以下结果:

使用Bash脚本

5. 命令行参数

命令行参数用于通过将输入传递给代码来使脚本更具动态性。在脚本运行时以以下形式传递这些参数:

 ./script_name arg1 arg2 arg3.....

脚本名称和所有传递的参数之间不要有空格。

如何使用命令行参数?

在Bash Shell中,它们与以下默认参数或特殊变量的引用一起使用。

  • $0 - 指定要调用的脚本的名称。
  • $1-$9 - 存储前9个自变量的名称,或可用作自变量的位置。
  • $# - 指定传递给脚本的参数总数(计数)。
  • $* - 通过将所有命令行参数连接在一起来存储它们。
  • $@ - 将参数列表存储为数组。
  • $? - 指定当前脚本的进程ID。
  • $$ - 指定最后一个命令或最近执行过程的退出状态。
  • $! - 显示最后一个后台作业的ID。

以下是用于传递命令行参数的两种方法:

方法1: 使用位置编号

下面是使用默认参数($1 ... $9)访问参数。下面对此进行了解释,将以下代码保存到文件:bash-argm1.sh

#!/bin/bash
echo $0 ' > echo $0'
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 '>echo $1 $2 $3 $4 $5 $6 $7 $8 $9'

执行上面示例代码,得到以下结果:

使用位置编号

方法2:使用数组

这是将参数作为数组传递,按照给定的算法应用此方法。

第1步:创建Bash脚本。
第2步:声明变量名称,并将值分配为$a,格式如下:

variable_name=("$@")

其中$@是默认参数,用于将参数(传递)存储为数组。

第3步:通过以以下形式指定数组索引来显示参数的值:

${variable_name[i]}

第4步:保存脚本到文件:bash-argm2.sh
第5步:通过传递参数来执行脚本。

请参阅以下程序:

#!/bin/bash  

args=("$@")  

echo ${args[0]} ${args[1]} ${args[2]} ${args[3]}

执行上面示例代码,得到以下结果:

使用数组

6. 命令替换

根据Bash官方文档

“命令替换允许命令的输出替换命令本身。Bash通过在子Shell环境中执行命令并用命令的标准输出替换命令替换来执行扩展,并删除任何尾随的换行符。但可能会在拆分单词时将其删除。”

命令替换是指Bash执行的扩展。它获取Bash命令的输出,存储在一个变量中(通常),并显示回显。

命令替换在脚本和变量分配方面提供了数据灵活性。具有单个命令行输出非常简单。万一输出超出了几行,然后删除新的尾随行,并且输出的全部内容最终都在一行上。

请参阅使用语法:

将命令替换为变量或命令替换的经典形式是使用反引号,如下所示:

variable_name=`command_name`  
variable_name=`command_name [option...] argument1 argument2...`  
variable_name=`/path/to/command`

通过将命令放在方括号(以美元符号($)开头)中来进行命令替换。如下:

variable_name=$(command_name)  
variable_name=$(command_name [option...] argument1 argument2...)  
variable_name=$(path/to/command)

在下面示例中,将单个命令ls替换为变量。请参阅终端上执行结果:
命令替换

第1行:不使用命令替换,输出将扩展为多行。
第2行和第3行:使用命令替换,输出在一行上结束(通过删除新的尾随行来节省空间)。

以下是Bash脚本来测试命令替换。

示例程序:bash-cvs.sh

#! /bin/bash  

# command substitution  

lsresult=$(ls)  
echo "My soure code files are:" $lsresult

运行上面示例代码,结果如下:

命令替换


上一篇:Bash引号

下一篇:Bash读取用户输入

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程