网站搜索

在 Shell 脚本中理解和编写“Linux 变量” - 第 10 部分


Linux shell脚本语言一直是一个热门话题,未来也将永远如此。 Shell 脚本语言很神奇,用脚本语言编写程序就像用任何其他语言一样容易。然而,它需要深入了解我们正在做什么以及预期的结果是什么。

我们为读者撰写的所有 shell 脚本文章都受到高度赞赏,包括最后一篇“Linux 变量的见解”。我们将上一篇文章扩展到一个新的水平。

变量属性

Linux 环境中的每个变量都有某些选项,这些选项称为“属性”。当需要时,可以使用命令“declare”来打开关闭这些选项或属性。

变量属性的一个示例是使用“-i”开关,它将打开相应变量的整数属性。即使将非数字值传递给开关“-i”,它也不会抛出错误消息并输出“0”作为整数解释。从下面的例子中就可以看得更清楚了。

声明一个变量 Integer, bill=121

avi@localhost:~$ declare -i bill=121

Printf 变量 bill 的值。

avi@localhost:~$ printf "%d\n" "$bill" 

121

令变量值为字符串。变量 bill 已经声明了,无需再次声明。只需将变量的值更改为即可。

avi@localhost:~$ bill=tecmint

现在,再次打印变量 bill 的值。

avi@localhost:~$ printf "%d\n" "$bill" 

0

注意错误消息处的“0”。

现在的问题是,如何知道已经声明的变量的属性呢?
avi@localhost:~$ declare -p bill 

declare -i bill="121"

在这里,-p(代表打印)开关来救援。

再说一遍,我应该怎么做才能关闭变量的属性呢?

为了关闭变量的属性,我们需要在开关之前放置一个+加号)符号。从下面的例子可以更清楚地看出这一点。

关闭上述变量的整数属性。

avi@localhost:~$ declare +i bill

检查变量的值。

avi@localhost:~$ printf "%d\n" "$bill" 

bash: printf: bill: invalid number
0

现在使用开关字符串打印变量的值。

avi@localhost:~$ printf "%s\n" "$bill" 

tecmint

在上面的例子中,bash 无法将非数字值判断为错误,但是 printf 正在解释什么可能是数字,什么不可能是数字。

只读变量

您可能听说过只读存储器(ROM),但什么是只读变量?和ROM有什么相似之处吗?

只读变量(例如只读内存)的值一旦分配就无法更改。因此它被称为只读。您无法写入、编辑或修改该变量的新值。这是一个使用示例的说明。

声明一个只读(-r)变量名,其值为“linux-console.net”。

avi@localhost:~$ declare -r name="linux-console.net"

Printf 上面声明的变量的值。

avi@localhost:~$ printf "%s\n" "$name" 

linux-console.net

尝试改变变量的值。

avi@localhost:~$ declare -r name="Avishek" 

bash: declare: name: readonly variable

如上所述,可以使用“+”符号更改只读变量的属性。

在 Linux 中导出变量

shell 脚本中声明的所有 shell 变量在脚本运行之前都可用。在脚本之外,脚本中的变量不存在。使变量在脚本外部可用的过程称为导出变量。

可以使用开关 declare -x(导出)将变量导出到 shell 之外,这会向 shell 确认您要导出的内容。声明导出开关可以用作。

avi@localhost:~$ declare -x variable=”Constant_Value”

当变量导出到脚本之外时,脚本运行时对变量所做的所有更改都会丢失。导出变量在 shell 脚本中非常重要。

我们想要一个只读且在脚本外部可用的变量,我们需要同时使用开关 -r 和开关 -x

avi@localhost:~$ declare -rx variable=”Constant_Value”

环境变量

在程序和执行它们的程序之间共享的变量。环境变量可以导出,但不能为其分配属性。

实际理解上述理论。这里我们有两个脚本0.sh1.sh

0.sh
#!/bin/bash 
declare -rx name=Tecmint 
bash 0.sh 
exit 0

第二个脚本是。

1.sh
#!/bin/bash 
printf "%s\n" "$name" 
name=linux-console.net 
printf "%s\n" "$name"
exit 0

这里发生的事情是,在调用第二个脚本之后,变量(名称)被声明为只读并导出。

第二个脚本只是打印第一个 printf 语句中导出的第一个脚本中的变量。在第二个 printf 语句中,它显示分配给变量“name”的新值。

不用担心该变量是只读的,如何重新分配它。您是否还记得“当变量导出到脚本之外时,脚本运行时对变量所做的所有更改都会丢失。 ”

参考

declare 命令允许使用下面的所有开关及其组合。

  1. -a :声明一个数组。
  2. -f:显示功能及定义。
  3. -F :显示函数名称。
  4. -r :将变量声明为只读。
  5. -x :将变量声明为可导出。
  6. -I :将变量声明为整数。

目前为止就这样了。在下一篇文章中,我们将讨论使用“eval”命令替换变量的方法以及在结束本主题之前在 bash 中已定义的变量。希望你们享受深入脚本编写的旅程。在此之前,请继续关注并连接到 linux-console.net