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

