在 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.sh和1.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 命令允许使用下面的所有开关及其组合。
- -a :声明一个数组。
- -f:显示功能及定义。
- -F :显示函数名称。
- -r :将变量声明为只读。
- -x :将变量声明为可导出。
- -I :将变量声明为整数。
目前为止就这样了。在下一篇文章中,我们将讨论使用“eval”命令替换变量的方法以及在结束本主题之前在 bash 中已定义的变量。希望你们享受深入脚本编写的旅程。在此之前,请继续关注并连接到 linux-console.net。