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 会话时会加载这些变量。这些变量用于定义系统属性。它们用大写字母定义。现在让我们看看一些系统定义的变量:
- BASH_VERSION
- 重击
- 残疾人士
- 操作系统类型
- 家
- 朗
- 主机名
- 小路
- 列
- 用户
注意:有更多系统定义的变量。以上是常见的系统定义变量。
您可以使用以下命令查看系统定义的变量列表:
- 放
- 环境
- 打印环境
输出如下所示:
- BASH_VERSION:显示当前 bash 版本的名称。
- BASH:显示外壳名称。
- PWD:代表“当前工作目录”。它显示您当前工作目录的路径。
- OSTYPE:只显示操作系统的名称。
- HOME:显示当前用户的主目录。
- LANG:显示 Linux 系统的语言。示例:LANG:en_IN
- HOSTNAME:显示主机的名称。示例:卡利
- 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 variable Result 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. $0 It 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 status Reason 0 Success 1-255 Failure 1 Catchall for general errors 2 Misuse of shell builtins 13 Permission denied 126 Command found but it is not executable 127 Command 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”命令)可以明显看出,输出扩展到多行。而如果我们使用命令替换,输出将打印在一行中(空格分隔)。