一問弄懂Shell變量四大分類
上一篇我們講述了Shell的基本概念和運(yùn)行方式,對(duì)Shell有了整體了解。如果說Shell是一棟大廈,那么變量便是一塊塊磚,是基礎(chǔ)元素。Shell變量比可編譯語言的變量更為復(fù)雜,種類更多,靈活性非常大,因此需要全面細(xì)致的把握。
Shell變量
什么是變量
變量是程序設(shè)計(jì)語言中的一個(gè)可以變化的量,當(dāng)然,可以變化的是變量的值。變量在幾乎所有的程序設(shè)計(jì)語言中都有定義,并且其涵義也大同小異。
從本質(zhì)上講,變量就是在程序中保存用戶數(shù)據(jù)的一塊內(nèi)存空間,而變量名就是這塊內(nèi)存空間的地址。 在程序的執(zhí)行過程中,保存數(shù)據(jù)的內(nèi)存空間的內(nèi)容可能會(huì)不斷地發(fā)生變化,但是,代表內(nèi)存地址的變量名卻保持不變。 由于變量的值是在計(jì)算機(jī)的內(nèi)存中,所以當(dāng)計(jì)算機(jī)被重新啟動(dòng)后,變量的值將會(huì)丟失。因此,對(duì)于需要長久保存的數(shù)據(jù),應(yīng)該寫入到磁盤中,避免存儲(chǔ)在變量中。
shell變量定義
shell變量是一種用來存放數(shù)據(jù)的編程元素,它可以幫助我們簡化很多工作 。shell變量的值可以是數(shù)字、字符串、文件名、命令的輸出等。shell變量可以在shell腳本中使用,也可以在命令行中使用,可以被賦值、修改、刪除、導(dǎo)出等。
shell變量賦值是使用等號(hào)(=)將變量的名稱和變量的值連接起來,例如:name=Tom。注意,等號(hào)兩邊不能有空格,否則會(huì)出錯(cuò)。shell變量的賦值可以在命令行中進(jìn)行,也可以在shell腳本中進(jìn)行。shell變量的賦值可以覆蓋之前的賦值,例如:name=Tom; name=Jerry。
shell變量使用時(shí)在變量的名稱前加上美元符號(hào)$
,例如:echo $name
。這樣就可以打印出變量的值。shell變量的使用可以在命令行中進(jìn)行,也可以在shell腳本中進(jìn)行。shell變量的使用可以和其他命令或字符串組合,例如:echo “My name is $name”。
shell變量分類
Shell變量可以分為以下幾種類型:
- 環(huán)境變量(Environment Variable):環(huán)境變量是在Shell啟動(dòng)時(shí)由操作系統(tǒng)設(shè)置的,它們對(duì)于所有的Shell和Shell執(zhí)行的程序都是可見的。一些常見的環(huán)境變量包括PATH、HOME、USER等。
- 本地變量(Local Variable):本地變量是由Shell程序定義的,僅在當(dāng)前Shell會(huì)話中可見,對(duì)于其他的Shell和Shell執(zhí)行的程序是不可見的。本地變量可以通過=符號(hào)來定義和賦值,例如myvar="hello"。
- 位置參數(shù)變量(Positional Parameter Variable):位置參數(shù)變量是用來存儲(chǔ)Shell腳本的命令行參數(shù)的,它們包括
$1
、$2
、$3
等。例如,如果我們運(yùn)行一個(gè)Shell腳本并且傳遞了兩個(gè)參數(shù),那么這兩個(gè)參數(shù)會(huì)被分別賦值給$1
和$2
。 - 特殊變量(Special Variable):特殊變量是由Shell程序預(yù)定義的,用于存儲(chǔ)一些特定的值或狀態(tài)。例如,
$?
用于存儲(chǔ)上一個(gè)命令的返回值,$$
用于存儲(chǔ)當(dāng)前Shell進(jìn)程的PID,$IFS
用于存儲(chǔ)當(dāng)前Shell的字段分隔符等。
環(huán)境變量
常見變量
在Linux Shell中,有許多預(yù)定義的環(huán)境變量。以下是一些常見的環(huán)境變量及其用途:
PATH
:用于定義可執(zhí)行文件的搜索路徑。當(dāng)我們輸入一個(gè)命令時(shí),Shell會(huì)在PATH變量指定的路徑中搜索該命令的可執(zhí)行文件。例如:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
HOME
:用于定義當(dāng)前用戶的主目錄路徑。該變量通常用于Shell腳本中,以便訪問用戶的主目錄下的文件和目錄。例如:
$ echo $HOME /home/myuser
USER
:用于定義當(dāng)前登錄用戶的用戶名。該變量通常用于Shell腳本中,以便獲取當(dāng)前腳本的執(zhí)行者。例如:
$ echo $USER myuser
PS1
:用于定義Shell提示符的格式。該變量通常用于自定義Shell提示符的外觀和行為。例如:
$ export PS1="[\e[32m]\u@\h:[\e[34m]\w[\e[0m]\$ "
定義一個(gè)帶有顏色的Shell提示符,其中u
代表用戶名,h
代表主機(jī)名,w
代表當(dāng)前工作目錄。
LANG
:用于定義當(dāng)前系統(tǒng)的默認(rèn)語言。該變量通常用于控制程序的本地化和國際化。例如:
$ echo $LANG en_US.UTF-8
PWD
:當(dāng)前工作目錄。例如:
$ echo $PWD /home/myuser
變量引用
在Shell腳本中,我們可以使用$符號(hào)來引用環(huán)境變量。例如:
#!/bin/bash echo "My home directory is $HOME" echo "My username is $USER" echo "My PATH is $PATH" echo "The value of MYVAR is $MYVAR"
執(zhí)行后輸出當(dāng)前用戶的主目錄、用戶名、PATH變量和MYVAR變量的值。
變量賦值
使用export命令可以將環(huán)境變量設(shè)置為全局變量,這樣它們就可以在當(dāng)前Shell會(huì)話中的所有進(jìn)程中使用。例如:
$ export MYVAR="hello"
定義一個(gè)名為MYVAR的環(huán)境變量,并將其值設(shè)為hello。
同時(shí),環(huán)境變量是可以重新賦值的,我們可以使用export命令將一個(gè)本地變量賦值給一個(gè)環(huán)境變量,或者直接在當(dāng)前Shell會(huì)話中使用export命令重新賦值一個(gè)已經(jīng)存在的環(huán)境變量。
例如,假設(shè)我們有一個(gè)名為MYVAR的環(huán)境變量,其當(dāng)前值為hello。我們可以使用以下命令將一個(gè)本地變量myvar賦值給MYVAR環(huán)境變量:
$ myvar="world" $ export MYVAR=$myvar
把本地變量myvar的值world賦值給環(huán)境變量MYVAR,此時(shí)MYVAR的值為world。
同樣地,我們也可以直接在當(dāng)前Shell會(huì)話中使用export命令重新賦值一個(gè)已經(jīng)存在的環(huán)境變量:
$ export MYVAR="world"
重新將MYVAR的值設(shè)置為world。
需要注意的是,一旦我們重新賦值了一個(gè)環(huán)境變量,該變量的新值將在當(dāng)前Shell會(huì)話中生效,同時(shí)也會(huì)影響到當(dāng)前Shell會(huì)話中的所有子進(jìn)程和后續(xù)的Shell會(huì)話。因此,如果我們需要在一個(gè)Shell會(huì)話中重新賦值一個(gè)環(huán)境變量,需要謹(jǐn)慎考慮其可能會(huì)對(duì)系統(tǒng)中其他程序的運(yùn)行產(chǎn)生的影響。
本地變量
變量定義
本地變量可以使用=符號(hào)進(jìn)行定義和賦值。例如:
$ myvar="hello"
定義一個(gè)名為myvar的本地變量,并將其值設(shè)為hello。我們可以使用echo命令來輸出該變量的值:
$ echo $myvar hello
本地變量只在當(dāng)前Shell會(huì)話中可見,對(duì)于其他的Shell和Shell執(zhí)行的程序是不可見的。
例如,如果我們在一個(gè)Shell會(huì)話中定義了一個(gè)本地變量:
$ myvar="hello"
那么在另一個(gè)Shell會(huì)話中,該變量是不存在的:
$ echo $myvar
變量引用
在Shell腳本中,我們可以使用$
符號(hào)來引用本地變量。例如:
#!/bin/bash myvar="hello" echo "The value of myvar is $myvar"
輸出The value of myvar is hello
。
變量賦值
本地變量可以被重新賦值,例如:
$ myvar="hello" $ echo $myvar hello $ myvar="world" $ echo $myvar world $ unset myvar $ echo $myvar
定義一個(gè)名為myvar的本地變量,并將其值設(shè)為hello,然后將其重新賦值為world,最后使用unset命令刪除該變量。
變量刪除
shell變量的刪除的方法是使用unset命令,例如:unset name,這樣就可以刪除變量的名稱和變量的值。shell變量的刪除可以在命令行中進(jìn)行,也可以在shell腳本中進(jìn)行,刪除可以釋放內(nèi)存空間,避免變量名沖突。
unset命令語法:unset [選項(xiàng)] [name ...]
選項(xiàng) | 含義 |
---|---|
-f | 僅刪除函數(shù) |
-v | 僅刪除變量(不包括只讀變量) |
-n | 刪除具有引用屬性的變量名(如果該選項(xiàng)存在) |
如果不加選項(xiàng)參數(shù),那么既可以刪除變量,也可以刪除函數(shù)。
需要注意的是,unset命令不能刪除只讀變量。
位置參數(shù)變量
變量定義
在Shell編程中,位置參數(shù)變量用于獲取腳本或函數(shù)的輸入?yún)?shù)。當(dāng)我們執(zhí)行一個(gè)Shell腳本或函數(shù)時(shí),我們可以將參數(shù)傳遞給該腳本或函數(shù),并在其中使用位置參數(shù)變量來獲取這些參數(shù)的值。
常見位置參數(shù)變量:
$0
:當(dāng)前腳本或函數(shù)的名稱。$1
、$2
、$3
、...:當(dāng)前腳本或函數(shù)的第一個(gè)、第二個(gè)、第三個(gè)參數(shù),以此類推。$#
:當(dāng)前腳本或函數(shù)的參數(shù)個(gè)數(shù)。$*
:當(dāng)前腳本或函數(shù)的所有參數(shù),作為一個(gè)字符串。$@
:當(dāng)前腳本或函數(shù)的所有參數(shù),作為一個(gè)數(shù)組。
變量引用
下面是一個(gè)使用位置參數(shù)變量的示例腳本:
#!/bin/bash echo "The name of this script is: $0" echo "The first parameter is: $1" echo "The second parameter is: $2" echo "The third parameter is: $3" echo "The total number of parameters is: $#" echo "All the parameters are: $*" echo "All the parameters are: $@"
當(dāng)我們執(zhí)行該腳本并傳遞三個(gè)參數(shù)時(shí),輸出將如下所示:
$ ./script.sh hello world 123 The name of this script is: ./script.sh The first parameter is: hello The second parameter is: world The third parameter is: 123 The total number of parameters is: 3 All the parameters are: hello world 123 All the parameters are: hello world 123
我們可以看到,使用位置參數(shù)變量可以輕松地獲取腳本或函數(shù)的輸入?yún)?shù),并對(duì)其進(jìn)行處理和操作。位置參數(shù)變量適用于編寫需要處理大量輸入?yún)?shù)的腳本。
特殊變量
變量定義
在Shell編程中,有很多特殊變量可以用來獲取各種系統(tǒng)信息和腳本信息,使用特殊變量能夠簡化代碼復(fù)雜度,減少使用復(fù)雜代碼來完成固定任務(wù)的情況,提升運(yùn)行效率。
常見的特殊變量:
$$
:當(dāng)前腳本或進(jìn)程的進(jìn)程ID。$?
:上一個(gè)命令或腳本的退出狀態(tài)碼。$!
:上一個(gè)后臺(tái)進(jìn)程的進(jìn)程ID。$USER
:當(dāng)前用戶的用戶名。$HOME
:當(dāng)前用戶的主目錄路徑。$PATH
:當(dāng)前系統(tǒng)的執(zhí)行路徑。$PWD
:當(dāng)前工作目錄路徑。$SHELL
:當(dāng)前使用的Shell程序路徑。$RANDOM
:一個(gè)0到32767之間的隨機(jī)數(shù)。$LINENO
:當(dāng)前腳本的行號(hào)。$IFS
:當(dāng)前腳本的字段分隔符。$PS1
:Shell提示符的格式。$PS2
:Shell續(xù)行提示符的格式。
變量引用
下面是一個(gè)使用特殊變量的示例腳本:
#!/bin/bash ? echo "The process ID of this script is: $$" echo "The exit status of the last command is: $?" echo "The process ID of the last background job is: $!" echo "The current user is: $USER" echo "The home directory of the current user is: $HOME" echo "The current PATH is: $PATH" echo "The current working directory is: $PWD" echo "The current shell is: $SHELL" echo "A random number between 0 and 32767: $RANDOM" echo "The current line number is: $LINENO" echo "The current field separator is: $IFS"
當(dāng)我們執(zhí)行該腳本時(shí),輸出將如下所示:
The process ID of this script is: 1234
The exit status of the last command is: 0
The process ID of the last background job is:
The current user is: username
The home directory of the current user is: /home/username
The current PATH is: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
The current working directory is: /home/username
The current shell is: /bin/bash
A random number between 0 and 32767: 2373
The current line number is: 7
The current field separator is:
通過示例可以看到,使用特殊變量可以輕松地獲取各種系統(tǒng)信息,并在腳本中使用它們來進(jìn)行處理和操作。在實(shí)際編程中,特殊變量能夠有效簡化代碼,提高執(zhí)行效率,特別是在需要獲取系統(tǒng)信息或處理系統(tǒng)事件的腳本中。
總結(jié)
Shell變量分為環(huán)境變量、本地變量、位置參數(shù)變量和特殊變量,實(shí)際使用中,四者有一定的重疊性。Shell變量是用好Shell編程的基礎(chǔ),靈活恰當(dāng)?shù)氖褂米兞靠梢院喕_本復(fù)雜度,提高腳本運(yùn)行效率和可讀性。
到此這篇關(guān)于一問弄懂Shell變量四大分類的文章就介紹到這了,更多相關(guān)shell變量內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell腳本實(shí)現(xiàn)磁盤監(jiān)控系統(tǒng)
這篇文章主要介紹了shell腳本實(shí)現(xiàn)磁盤監(jiān)控系統(tǒng),幫助大家更好的利用shell腳本管理數(shù)據(jù),感興趣的朋友可以了解下2020-09-09linux啟動(dòng)級(jí)別的含義(init 0-6)
這篇文章主要介紹了linux啟動(dòng)級(jí)別的含義(init 0-6),需要的朋友可以參考下2014-02-02Linux壓縮和解壓命令大全之tar、gzip和zip詳細(xì)教程
本文介紹了常用的壓縮和解壓命令,包括tar、gzip和zip,通過使用這些命令,我們可以方便地對(duì)文件和目錄進(jìn)行壓縮和解壓操作,從而節(jié)省存儲(chǔ)空間和提高傳輸效率,需要的朋友可以參考下2023-09-09Shell腳本實(shí)現(xiàn)監(jiān)視指定進(jìn)程的運(yùn)行狀態(tài)
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)監(jiān)視指定進(jìn)程的運(yùn)行狀態(tài),本文直接給出腳本代碼,需要的朋友可以參考下2015-07-07Shell中使用scp命令實(shí)現(xiàn)文件上傳代碼
這篇文章主要介紹了Shell中使用scp命令實(shí)現(xiàn)文件上傳代碼,本文講解使用scp命令實(shí)現(xiàn)名登錄上傳文件,需要的朋友可以參考下2015-04-04