1.
. test.sh
test.sh
#!/bin/bashdeclare -A myMap
myMap["key1"]="value1"
myMap["key2"]="value2"
myMap["key3"]="value3"forkeyin"${!myMap[@]}";doecho"Key: $key, Value: ${myMap[$key]}"done
**执行
. test.sh
,输出如下:**
root@hg-pc:/home/hg/Desktop# . test.sh
Key: key2, Value: value2
Key: key3, Value: value3
Key: key1, Value: value1
**此时,修改test.sh,将赋值操作全部去掉,同样执行
. test.sh
**
```bash
#!/bin/bashdeclare -A myMap
forkeyin"${!myMap[@]}";doecho"Key: $key, Value: ${myMap[$key]}"done
输出如下:
root@hg-pc:/home/hg/Desktop# . test.sh
Key: key2, Value: value2
Key: key3, Value: value3
Key: key1, Value: value1
**
myMap明明是个空的,为什么还能打印出数据???
**
**使用点号(
.
)和空格来执行一个脚本,后面跟着脚本的文件名。这种方式在Shell中被称为“点命令”(Dot command)或“source”命令。它的作用是
在当前Shell环境中执行指定的脚本
。也可以使用
source test.sh
来实现相同的效果。使用
. test.sh
执行脚本时,
脚本文件会在当前Shell环境中执行,不会创建新的子进程。脚本文件中的环境变量和函数会影响到当前Shell的环境
。这种执行方式通常用于加载配置文件或在当前Shell中定义函数和变量。**
也可以这么理解,第一次执行赋值后,哪怕第二次把赋值操作给去了,它也能打印出数据,因为隶属于同一个终端,,,
此时开启一个新的终端,再次执行 . test.sh,可以看出,,没有任何输出。。。
root@hg-pc:/home/hg/Desktop# . test.sh
root@hg-pc:/home/hg/Desktop#
2.
. /test.sh
#!/bin/bashnum=23echo"### ${num}"
root@hg-pc:/home/hg/Desktop# . test.sh### 23
**
第一次执行后, 这个num在当前终端中始终存在。
**
#!/bin/bashecho"### ${num}"
root@hg-pc:/home/hg/Desktop# . test.sh ### 23
**
所以即使此处直接输出num,也还能打印出值。
**
**
下面来看 ./test.sh
**
开启一个新终端,命名为2号终端。
#!/bin/bashnum=23echo"### ${num}"
root@hg-pc:/home/hg/Desktop# ./test.sh ### 23
仍然在2号终端中执行。
#!/bin/bashecho"### ${num}"
root@hg-pc:/home/hg/Desktop# ./test.sh ###
**使用
./test.sh
执行脚本时,Shell会创建一个子进程来执行脚本文件。
脚本文件中的环境变量和函数在子进程中生效,但不会影响到当前Shell的环境
。**
总结:
./test.sh
是在子进程中执行脚本文件,而
test.sh
是在当前Shell环境中执行脚本文件。
版权归原作者 @十三阿哥 所有, 如有侵权,请联系我们删除。