📜  Bash 脚本——定义 Bash 变量及其类型

📅  最后修改于: 2022-05-13 01:56:14.016000             🧑  作者: Mango

Bash 脚本——定义 Bash 变量及其类型

变量是任何编程语言的一个重要方面。没有变量,您将无法存储任何所需的数据。在变量的帮助下,数据存储在特定的内存地址,然后可以在需要时访问和修改。换句话说,变量让您可以存储、读取、访问和操作数据。

Bash 变量的工作

当您编写 bash 脚本时,您要么想要操作已定义的变量,设置变量的值,要么只是读取预定义的变量。有多种方法可以设置变量的值:

1)直接赋值

myvar="Gfg"

2)根据从程序或命令获得的结果的值设置其值(检查下面的命令替换主题)

如果要将变量的值分配给另一个变量,请使用“$”符号,否则将显示错误:

请注意,当我们将 newvar 的值定义为不带“$”符号的 myvar 时,它会将值打印为“myvar”,而不是获取变量“myvar”的值。

输出:

示例脚本:

#! /bin/bash 
var1=5
Add () {
    var1=$(($var1 + 10))
    echo $var1 

}
Add 
#Assigning the output of function Add to another variable 'var2'.
var2=$var1
echo $var2

输出:

15
15

3) 只需在变量名前使用 $ 符号即可读取该变量。例子:

echo "The value of variable, myvar is $myvar"

现在我们了解了如何读取变量或为其赋值,让我们看看运行 bash 脚本后会发生什么:

  • 它检查脚本中定义的变量。
  • 逐行解释代码。
  • 然后,它将变量名称替换为其分配的值。
  • 最后,通过重复上述过程逐行执行代码。

命名变量

命名变量时需要牢记一些规则:

  • 变量可以以字母数字字符或下划线开头,后跟字母、数字或下划线。
  • 变量区分大小写,因此“gfg”和“Gfg”是两个不同的变量。
  • 变量不能以数字开头。
  • 定义变量名时不要使用特殊字符。

正确定义的变量名称示例

gfg
GFG
Gfg
_gfg
g_f_g
March6

错误定义的变量名示例

6March
567
!gfg
@Gfg
gfg*GFg

声明变量或设置其值的语法

声明或设置变量的值相当简单。基本语法如下:

variableName=value

示例

myvar=geeks

变量名、等号和分配的值之间不应有任何空格。否则会遇到错误:

如果变量的值包含空格,则使用引号来定义它们。

myvar="Geeks for geeks"

您还可以使用 declare 命令声明变量:

declare myvar="geeks"

在 bash 中使用局部变量和全局变量

当您在 shell 中定义变量时,它只能在该特定会话期间访问。因为那是一个局部变量。在下面的示例中,您可以看到当我们尝试在新会话(会话编号-1692)中访问变量“var1”时,它不会打印我们的变量值。

注意: echo $$ 用于打印当前会话的进程 ID(参见下面的特殊变量)

为了使任何子会话/进程(当前会话)可以全局访问该变量,我们可以使用“导出”命令。使用 export 命令,您也可以在另一个会话中访问在上一个会话中定义的变量。例子:

现在让我们看看如何在编写 shell 脚本时定义局部和全局变量。它与任何其他编程语言没有什么不同。

使用以下命令创建文件 var.sh:

touch var.sh

使用以下命令在 vim 编辑器中打开它:

vim var.sh

按 Esc 和“i”进入插入模式。

在这个脚本中,我们将定义一个全局变量“myvar”和一个局部变量“myvar”。然后我们将尝试在函数中更改变量“myvar”的值。最后,我们尝试调用函数并打印局部变量和全局变量的值。我们将看到只有局部变量的值会被改变。

#! /bin/bash 
myvar=5

function calc(){

# use keyword 'local' to define a
# local variable 
local myvar=5
(( myvar=myvar*5 )) 

# print the value of local variable 
echo $myvar 
}

# call the function calc 
calc 

# print the value of global variable and
# observe that it is unchanged.
echo $myvar 

使用“:wq!”保存文件。

并使用以下命令运行它:

bash var.sh

输出:

打印的第一个值是我们的局部变量,第二个值是我们没有改变的全局变量,无论我们在函数“calc”中执行的操作如何。

bash 变量的类型

bash 中有两种类型的变量:

  • 系统定义的变量或环境变量
  • 用户定义的变量

系统定义的变量

这些是预定义的变量或由 Linux bash shell 创建和维护的变量。当您打开一个新的 bash 会话时会加载这些变量。这些变量用于定义系统属性。它们用大写字母定义。现在让我们看看一些系统定义的变量:

  1. BASH_VERSION
  2. 重击
  3. 残疾人士
  4. 操作系统类型
  5. 主机名
  6. 小路
  7. 用户

注意:有更多系统定义的变量。以上是常见的系统定义变量。

您可以使用以下命令查看系统定义的变量列表:

  • 环境
  • 打印环境

输出如下所示:

  1. BASH_VERSION:显示当前 bash 版本的名称。
  2. BASH:显示外壳名称。
  3. PWD:代表“当前工作目录”。它显示您当前工作目录的路径。
  4. OSTYPE:只显示操作系统的名称。
  5. HOME:显示当前用户的主目录。
  6. LANG:显示 Linux 系统的语言。示例:LANG:en_IN
  7. HOSTNAME:显示主机的名称。示例:卡利
  8. PATH:它显示一个有序的路径列表(用冒号分隔)。例子:

9. COLUMNS:显示用于在终端上显示输出的列的长度。

10. USER:显示当前用户。示例:根

用户定义的变量

这些是您定义和赋值的变量。

句法:

variable_name=value

例子:

myvar=gfg

如果变量的值包含空格,则使用引号来定义它们。

myvar="Geeks for geeks"

示例脚本:

  • 创建一个名为 – gfg.sh 的文件。

  • 打开 vim 编辑器并通过按 Esc 并输入“i”进入插入模式。
  • 编写脚本:
#! /bin/bash
myvar=Hello
newvar=”welcome to gfg”
echo “$myvar, $newvar”
#variables are case sensitive
Myvar=”Hi again!”
echo “$Myvar”
  • 按 Esc 和“:w”保存更改。
  • 然后按 Esc 和“:q”退出。
  • 使用以下命令运行脚本:“bash gfg.sh”

请注意,建议(但不是必需)以小写字母定义变量。确保定义的变量名与系统定义的变量名不一致。

用户定义的变量在 shell 脚本执行后被删除。相反,系统定义的变量可以被任何其他应用程序访问,并且不存储在任何文件中。

内置特殊变量

Bash 带有一些内置的特殊变量。这些变量存储了一些重要的数据,当您编写 shell 脚本时可以派上用场。它们可供所有用户使用。以下是这些特殊变量的列表以及它们存储的结果:

Special variableResult stored
$$It represents the process ID of the current shell of the user. Example: 1692
$?It returns the exit status of the last executed command. Example: 127–> This is the exit status if the command was not found.
$0It represents the script name.
$1-$9$1 to $9 represents the 1st to 9th argument passed with the script.
${10}-${n}It represents the 10th argument to the nth argument passed with the script.
$#It represents the length of any value or the number of arguments passed to the given script.
$@ or $*It represents the list of all arguments that are passed to the script

特殊变量 - $$

这个特殊变量给出了当前 shell 的 PID 或进程标识符。在 shell 脚本的情况下,它给出了运行脚本的 PID。

特殊变量-$?

每个命令都返回一个退出状态。因此,退出状态可用于识别命令是否成功终止或是否存在错误。

一些常见的退出状态:

Exit statusReason
0Success
1-255Failure
1Catchall for general errors
2Misuse of shell builtins
13Permission denied
126Command found but it is not executable
127Command not found

在 Bash 中使用数组变量

数组用于存储数据,在 bash 中,您可以将不同类型或相同类型的值存储在数组中。

有多种方法可以声明数组及其元素。然而,在本教程中,我们将通过定义以空格分隔的元素来声明一个数组。

句法:

arrayName=(element1 element2 element3 element4)

注意:如果您的元素包含空格,则将该元素括在引号中。

获取数组长度的语法:

{#arrayName[@]}

获取特定数组元素的语法:

{arrayName[index]}

获取特定数组元素长度的语法:

{#arrayName[index]}

示例脚本:

在这个例子中,我们将编写一个脚本来遍历数组元素,打印它们的名称和各自的长度。

创建一个名为“myarray.sh”的文件。在 vim 编辑器中打开文件。

#! /bin/bash

# declare an array with pre-defined values 
declare -a my_data=(Learning "Bash variables" from GFG); 

# get length of the array 
arrLength=${#my_data[@]}

# print total number of elements in the array
echo "Total number of elements in array is: $arrLength"

# iterate through the array and print length of 
# each element and their values
echo "Below are the elements and their respective lengths:"
for (( i=0; i '${my_data[$i]}'; and its length is ${#my_data[i]}"
done

# print the whole array at once
echo "All the elements in array : '${my_data[@]}'"

输出:

显式声明变量的数据类型

在 bash 中,我们不需要像任何其他编程语言(int、str 等)那样声明数据类型。数据类型由 shell 脚本/shell 本身标识(在 bash 中定义的变量称为无类型变量)。但是在某些情况下,您可能需要显式定义数据类型。在这种情况下,您可以使用 declare 命令创建具有特定数据类型的变量。 Declare 命令提供了许多标志来显式声明数据类型。以下是这些标志的列表:

整数

您可以使用以下命令声明一个整数:

declare -i myvar

现在您已将变量“myvar”的数据类型定义为整数,如果您尝试将其值分配为浮点数,则会出现错误。

请注意,如果您尝试将“myvar”的值分配为字符串。它将字符串“xyz”评估为整数,因此打印 0。而浮点数给出错误。

大批

使用标志“-a”声明数组。

declare -a myarray

要么

declare -a myarray=([element1 element2 element3])

关联数组

使用标志“-A”声明关联数组

declare -A newArray=([key1]=value1 [key2]=value2 [key3]=value3)

使用以下命令打印数组的所有值:

${newArray[@]}

要么

${newArray[*]}

例子:

使用以下命令打印数组的所有键:

${!newArray[@]}

要么

${!newArray[*]}

要打印这两个键值对,您可以使用 for 循环:

# ! /bin/bash
# declare array
declare -A newArray=([Ron]=10 [John]=30 [Ram]=70 [Shyam]=100)

# iterate through the array
for key in "${!newArray[@]}";
do
    echo "$key scored : ${newArray[$key]} in Math test";
done

输出:

命令行参数

命令行参数或位置参数用于将输入传递给 shell 脚本或命令。使用命令行参数使脚本更加动态。

句法:

bash script.sh argument1 argument2 argument3 argument4 .......

您可以将上述特殊变量作为参数传递给您的 shell 脚本。

例子:

创建一个名为“example1.sh”的脚本。

#! /bin/bash 
# declare a variable which will store all
# the values of our arguments, in doing so
# we will make use of the special variable 
# "$@". Alternatively, "$*" can also be used. 

myvar=("$@")

# Lets store the length of the number of arguments 
# (currently unknown) in another variable.
# Here we can make use of the special variable '$#' 

le="$#"
echo $le
# let us now print the arguments that user 
# passed by looping through the length of
# the number of arguments

for (( i=0; i ${myvar[i]}"
done

在上面的脚本中,我们使用了特殊变量“$@”和“$#”。

现在让我们尝试使用其他特殊变量。

创建另一个脚本“example2.sh”

#! /bin/bash 

echo "The process ID of current shell is: $$" 
echo "The exit status of last executed command was: $?"
echo "The name of this script is: $0"
echo "First argument passed to this script is: $1"
echo "Second argument passed to this script is: $2"
echo "Total number of arguments passed to this script is: $#"
echo "His full name is: $1 $2"

您会注意到,使用命令行参数可以帮助您减少要在脚本中定义的变量数量。

命令替换

有时,在编写 shell 脚本时,您会遇到一些将特定命令的输出分配给变量的情况。这可以在命令替换的帮助下完成。命令替换通常通过运行特定的 shell 命令并将其结果存储在变量中以供进一步使用或显示。

句法:

varname=`command-name`
Example: myvar=`ls`

要么

varname=$(command-name)
Example: myvar=$(ls)

在上述示例中,命令的输出:'ls' 将存储在变量 'myvar' 中。现在让我们看看打印变量“myvar”后得到的输出:

从第一个终端的结果(即通过简单地运行“ls”命令)可以明显看出,输出扩展到多行。而如果我们使用命令替换,输出将打印在一行中(空格分隔)。