在学理方面,为什么环境变量的数据可以被子程序所引用呢?这是因为内存配置的关系!理论上是这样的:
当启动一个 shell,操作系统会分配一记忆区块给 shell 使用,此内存内之变量可让子程序取用
若在父程序利用 export 功能,可以让自订变量的内容写到上述的记忆区块当中(环境变量);
当载入另一个 shell 时 (亦即启动子程序,而离开原本的父程序了),子 shell 可以将父shell 的环境变量所在的记忆区块导入自己的环境变量区块当中。
通过这样的关系,我们就可以让某些变量在相关的程序之间存在,以帮助自己更方便的操作环境喔! 不过要提醒的是,这个“环境变量”与“bash 的操作环境”意思不太一样,举例来说,PS1 并不是环境变量, 但是这个 PS1 会影响到 bash 的接口。
10.2.6 变量键盘读取、阵列与宣告: read, array, declare
read
要读取来自键盘输入的变量,就是用 read 这个指令了。这个指令最常被用在 shell script 的撰写当中。
read 之后不加任何参数,直接加上变量名称,那么下面就会主动出现一个空白行等待你的输入(如范例一)。 如果加上 -t 后面接秒数,例如上面的范例二,那么 30 秒之内没有任何动作时, 该指令就会自动略过了。
declare / typeset
declare 或 typeset 是一样的功能,就是在“宣告变量的类型”。如果使用 declare 后面并没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set 一样啦! 那么 declare 还有什么语法呢?看看先:
由于在默认的情况下面, bash 对于变量有几个基本的定义:
变量类型默认为“字串”,所以若不指定变量类型,则 1+2 为一个“字串”而不是“计算式”。所以上述第一个执行的结果才会出现那个情况的;
bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;
阵列 (array) 变量类型
阵列的变量类型比较有趣的地方在于“读取”,一般来说,建议直接以 ${阵列} 的方式来读取。