快速入門Shell編程(七)變量引用及作用範圍

變量引用

那麼定義好變量,如何打印變量的值呢?舉例下變量引用的方式。

  • ${變量名}稱作爲對變量的引用
  • echo ${變量名}查看變量的值
  • ${變量名}在部分情況下可以省略成 $變量名
[root@lincoding ~]# string="hello Shell"
[root@lincoding ~]# echo ${string}
hello Shell
[root@lincoding ~]# echo $string
hello Shell

那麼有花括號括起來的變量和沒有花括號的區別是什麼呢?

[root@lincoding ~]# echo $string9

[root@lincoding ~]# echo ${string}9
hello Shell9

可以發現在引用string變量後加了個9,沒有加花括號的引用,會把string9當做一個變量名,有加花括號的引用,則在打印string變量後,尾部多增加一個9


變量的默認作用範圍

我們通過定義的變量只會在當前的Shell環境生效,當切換成另外一個Shell的時候,之前定義好的變量是不生效的

我們在Shell腳本里定義了一個變量str

#!/bin/bash

str="my shell"
echo ${str}

執行Shell腳本的時候,會打印在Shell腳本定義的變量的值。當前終端引用了Shell腳本的變量,打印了空值。

[root@lincoding ~]# ./test.sh
my shell
[root@lincoding ~]# echo ${str}

[root@lincoding ~]#

說明變量str作用範圍只在Shell腳本里。

如果在終端定義個一變量,Shell腳本里引用該變量會生效嗎?

[root@lincoding ~]# mystr="abc"
[root@lincoding ~]# cat test.sh
#!/bin/bash

echo ${mystr}
[root@lincoding ~]# ./test.sh

[root@lincoding ~]# bash test.sh

[root@lincoding ~]# . test.sh
abc
[root@lincoding ~]# source test.sh
abc

上面分別使用了四種執行方式運行腳本,這四種執行方式的影響也在前面章節詳細說明過。

方式一和方式二,是會產生子進程來執行腳本,由於當前終端定義的變量作用範圍只在當前的終端,所以子進程引用於父進程定義的變量是不生效的。

方式三和方式四,是不會產生子進程,而是直接在當前終端環境執行腳本,所以也在變量的作用範圍內,所以引用了變量是生效的。


export導出變量

假設想讓父進程定義的變量在子進程或子Shell也同時生效的話,那麼需要用export將變量導出,使用的具體方式如下例子:

[root@lincoding ~]# mystr="abc"
[root@lincoding ~]# bash test.sh

[root@lincoding ~]# export mystr
[root@lincoding ~]# bash test.sh
abc
[root@lincoding ~]# ./test.sh
abc

可見在使用export後,終端定義的變量,test.sh腳本里引用了該變量是生效的。也就說子進程可以獲取父進程定義的變量的值。

如果用完了該變量,想把變量清空,則可以使用unset

[root@lincoding ~]# unset mystr
[root@lincoding ~]# echo ${mystr}

[root@lincoding ~]#

小結

變量默認的作用範圍是Shell的自身,如果想爲子Shell或子進程來使用父進程的變量,我們需要用export 變量名關鍵詞進行導出變量,如果不再使用該變量,要及時使用unset 變量名來清空變量的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章