- Linux自動(dòng)化運(yùn)維:Shell與Ansible(微課版)
- 楊寅冬主編
- 3252字
- 2024-07-26 17:04:22
1.2.5 Shell變量
在編程語言中,變量是一種存儲(chǔ)數(shù)據(jù)的容器。它可以用來保存各種類型的數(shù)據(jù),如數(shù)字、字符串、布爾值等。在Shell中,變量也是一種存儲(chǔ)數(shù)據(jù)的容器,它有著與其他編程語言中的變量類似的基本概念,主要包括以下內(nèi)容。
(1)變量名。變量名是變量的唯一標(biāo)識(shí),通常是一個(gè)字母或下畫線開頭的字符序列,如name、age、_score等。在Shell中,變量名只能由字母、數(shù)字和下畫線組成,且不能以數(shù)字開頭。變量名區(qū)分字母大小寫,如NAME和name是不同的變量,環(huán)境變量建議使用全大寫字母命名。
(2)變量類型。在Shell中,變量可以存儲(chǔ)任何類型的數(shù)據(jù),如整數(shù)、浮點(diǎn)數(shù)、字符串、布爾值等。變量的類型是由它所存儲(chǔ)的數(shù)據(jù)決定的。
(3)變量值。變量值是指變量當(dāng)前存儲(chǔ)的數(shù)據(jù)。在Shell中,變量值可以通過賦值語句來修改。例如,在Bash中,可以使用a=10語句將變量a的值設(shè)為10。

V1-5 Shell變量
(4)變量作用域。變量作用域是指變量的有效范圍。在Shell中,變量可以被定義為全局變量或局部變量。全局變量是指在整個(gè)Shell會(huì)話中都有效的變量。它們可以在任何地方被訪問和修改,用戶可以使用export命令將變量定義為全局變量。局部變量是指僅在特定的代碼塊或函數(shù)中有效的變量,它們只能在定義它們的代碼塊或函數(shù)中被訪問和修改。
(5)定義和調(diào)用變量。在定義變量時(shí),變量名和變量值之間需要使用等號(hào)“=”連接,變量名與等號(hào)之間不能有空格。在調(diào)用變量時(shí),變量名需要使用$符號(hào)引用。
Shell中主要的變量類型如表1-6所示。
表1-6 Shell中主要的變量類型

1. 定義和調(diào)用變量
在Shell中,可以使用賦值語句來定義變量。
賦值語句的格式如下。
varname=varvalue
其中,varname表示變量名;varvalue表示變量值。
下面是在Shell中定義變量的幾個(gè)示例。
# 定義字符串變量 name="John Smith" # 定義數(shù)值變量 age=30 # 定義數(shù)組變量 fruits=("apple" "banana" "orange") # 定義浮點(diǎn)數(shù)變量 HEIGHT=1.75 # 定義布爾值變量 IS_ADMIN=true
一些特殊的變量,如$0、$1等,是由Shell自動(dòng)賦值的,用于存儲(chǔ)特定的信息。例如,$0變量存儲(chǔ)的是腳本的文件名,$1變量存儲(chǔ)的是腳本的第一個(gè)參數(shù)。
在Shell中,要訪問變量的值,可以使用$varname的形式,即在變量名前面加上符號(hào)“$”。例如:
# 定義字符串變量 NAME="John Smith" # 訪問變量的值 echo "Name is $NAME" # 輸出:Name is John Smith
如果變量名中包含其他字符和特殊字符,或者變量名和其他文本混合在一起,則需要使用花括號(hào)“{}”來指定變量名。例如:
# 定義字符串變量 NAME="John" # 訪問變量的值 echo "Name is ${NAME}_Smith" # 輸出:Name is John_Smith
如果不使用花括號(hào),則等號(hào)右邊的字符會(huì)被當(dāng)作變量的一部分,從而導(dǎo)致錯(cuò)誤。例如:
# 定義字符串變量 name="John" # 使用變量 echo "Hello, $name_Doe!" # 輸出: Hello, !
在這種情況下,變量名后面的_Doe被當(dāng)作變量的一部分,因此會(huì)返回空字符串。因此,在使用變量時(shí),如果變量名后面跟有其他字符或者變量名組成的字符串,則通常需要使用花括號(hào)來指明變量名的邊界。
此外,在使用變量的特殊語法時(shí),也需要使用花括號(hào)。例如,在使用${var:pos}和${var:pos:len}的形式訪問變量值的子字符串時(shí),需要使用花括號(hào)。其中,var是變量的名稱;pos是起始位置的偏移量,表示從變量值的第pos個(gè)字符開始,返回變量值的子字符串;len是子字符串的長度,表示從變量值的第pos個(gè)字符開始,返回長度為len的子字符串。例如:
# 定義字符串變量 string="abcdef" # 使用變量 echo "${string:1}" echo "${string:2:3}" # 輸出: bcdef cde # 定義字符串變量 name="John" # 調(diào)用變量,從字符串變量name的第二個(gè)字符(從0開始計(jì)數(shù))開始,截取到字符串的末尾 echo "${name:1}" 輸出: ohn # 定義字符串變量 name="John" # 調(diào)用變量,從字符串變量name的第二個(gè)字符(從0開始計(jì)數(shù))開始截取,截取長度為2 echo "${name:1:2}" # 輸出: oh
注意,如果pos或len超出了變量值的長度范圍,則將返回空字符串。
這些特殊的語法可以方便地對(duì)變量的值進(jìn)行操作和提取,使用這些語法截取變量值的一部分,或者獲取變量值的長度等操作,可以提高腳本的靈活性和可讀性。
數(shù)組變量是一種變量類型,可以存儲(chǔ)多個(gè)值。在大多數(shù)Shell中,數(shù)組是用一個(gè)變量名加圓括號(hào)的形式來表示的。例如:
array=(1 2 3 4 5)
這樣,數(shù)組array就被定義為包含5個(gè)元素的數(shù)組,每個(gè)元素可以是一個(gè)字符串或數(shù)字。
要訪問數(shù)組的元素,可以使用${var[index]}的形式。其中,var表示數(shù)組的名稱;index表示要訪問的元素的索引,索引從0開始。例如:
# 定義數(shù)組變量 fruits=("apple" "banana" "orange") # 使用變量 echo "I like ${fruits[0]} and ${fruits[1]}" # 輸出: I like apple and banana
要獲取數(shù)組的所有元素,可以使用*或@符號(hào):
echo ${array[*]} 1 2 3 4 5 echo ${array[@]} 1 2 3 4 5
這兩種符號(hào)的區(qū)別在于,*符號(hào)會(huì)將所有元素看作一個(gè)單獨(dú)的字符串,而@符號(hào)會(huì)將每個(gè)元素看作單獨(dú)的字符串。
注意:在使用變量時(shí),如果變量名被包含在雙引號(hào)中,則變量名會(huì)被替換為變量的值;如果變量名被包含在單引號(hào)中,則變量名不會(huì)被替換。
2. 預(yù)設(shè)位置參數(shù)變量
在Shell中,有許多系統(tǒng)預(yù)設(shè)變量,可以方便地用于訪問系統(tǒng)信息和執(zhí)行狀態(tài)。其中,位置參數(shù)變量主要用來向腳本中傳遞參數(shù)或數(shù)據(jù),其變量名不能自定義,變量作用也是固定的。常見的系統(tǒng)預(yù)設(shè)位置參數(shù)變量如表1-7所示。
表1-7 常見的系統(tǒng)預(yù)設(shè)位置參數(shù)變量

位置參數(shù)變量主要用于獲取腳本的輸入?yún)?shù),并根據(jù)這些參數(shù)執(zhí)行相應(yīng)的操作。
3. 查看環(huán)境變量
在Linux操作系統(tǒng)中,環(huán)境變量是一種特殊的變量,它們用于存儲(chǔ)系統(tǒng)的配置信息。環(huán)境變量是系統(tǒng)級(jí)別的變量,它們可以在整個(gè)系統(tǒng)中使用,在用戶的會(huì)話中也可以使用。環(huán)境變量通常用于存儲(chǔ)系統(tǒng)路徑、可執(zhí)行文件的名稱、用戶名等信息。系統(tǒng)預(yù)設(shè)環(huán)境變量的命名規(guī)則通常是采用全大寫字母。常見的系統(tǒng)預(yù)設(shè)環(huán)境變量如表1-8所示。
表1-8 常見的系統(tǒng)預(yù)設(shè)環(huán)境變量

在Linux操作系統(tǒng)中,可以使用以下方法查看環(huán)境變量。
(1)使用printenv命令查看系統(tǒng)中所有的環(huán)境變量。例如:
[opencloud@server ~]$ printenv
(2)使用echo命令查看某個(gè)特定的環(huán)境變量的值。例如:
# 查看HOME環(huán)境變量的值 [opencloud@server ~]$ echo "$HOME" /home/opencloud # 查看LANG環(huán)境變量的值 [opencloud@server ~]$ echo "$LANG" en_US.UTF-8
(3)使用env命令查看當(dāng)前進(jìn)程的環(huán)境變量。例如:
[opencloud@server ~]$ env
(4)使用set命令查看當(dāng)前Shell的所有變量,包括環(huán)境變量和Shell變量。例如:
[opencloud@server ~]$ set
(5)使用cat /proc/PID/environ命令查看某個(gè)進(jìn)程的環(huán)境變量。例如:
# 查看進(jìn)程9750的環(huán)境變量 [opencloud@server ~]$ cat /proc/9750/environ
4. 設(shè)置環(huán)境變量
在Shell中,export命令用于將變量設(shè)置為環(huán)境變量,設(shè)置的環(huán)境變量可以在整個(gè)系統(tǒng)中使用,在用戶的會(huì)話中也可以使用。
export命令的基本語法如下。
export [變量名]=[變量值]
使用export命令設(shè)置環(huán)境變量及其驗(yàn)證方法如下。
(1)使用等號(hào)賦值。例如:
[opencloud@server ~]$ export NAME="John" [opencloud@server ~]$ export USERNAME="Tom" [opencloud@server ~]$ export MYHOME="/home/john"
注意:在Shell中,環(huán)境變量通常使用大寫字母。
(2)使用echo命令查看環(huán)境變量的值。例如:
[opencloud@server ~]$ echo $NAME John [opencloud@server ~]$ echo $USERNAME Tom [opencloud@server ~]$ echo $MYHOME /home/john
(3)使用環(huán)境變量的當(dāng)前值。例如:
[opencloud@server ~]$ echo $PATH /home/ opencloud/.local/bin:/home/ opencloud /bin:/usr/bin:/bin:/usr/sbin:/sbin: /usr/local/openssh/bin:/usr/local/sbin [opencloud@server ~]$ export PATH=$PATH:/usr/local/bin [opencloud@server ~]$ echo $PATH # 查看PATH環(huán)境變量的輸出結(jié)果 /home/ opencloud/.local/bin:/home/ opencloud /bin:/usr/bin:/bin:/usr/sbin:/sbin: /usr/local/openssh/bin:/usr/local/sbin:/usr/local/bin # export命令用于將 /usr/local/bin目錄添加到系統(tǒng)路徑中
export命令設(shè)置的環(huán)境變量只對(duì)當(dāng)前Shell有效,在關(guān)閉Shell后將失效。如果想永久設(shè)置環(huán)境變量,則建議在配置文件中進(jìn)行設(shè)置,如在/etc/profile或~/.bash_profile~/.bashrc等配置文件中進(jìn)行設(shè)置。
使用export命令在~/.bashrc文件中設(shè)置MYVAR環(huán)境變量:
[opencloud@server ~]$ echo "export MYVAR=123" >> ~/.bashrc
~表示當(dāng)前用戶的家目錄,export命令會(huì)將export MYVAR=123添加到~/.bashrc文件的末尾,從而設(shè)置MYVAR環(huán)境變量。
在修改環(huán)境變量所在配置文件之后,需要重新登錄系統(tǒng)或在命令行中使用source命令來使配置生效。source命令的主要作用是加載并執(zhí)行配置文件。使用source命令加載配置文件的好處是,可以在當(dāng)前Shell中使修改立即生效,而不需要重新打開一個(gè)新的Shell。
使用source命令,使~/.bashrc文件中設(shè)置的MYVAR環(huán)境變量生效:
[opencloud@server ~]$ source ~/.bashrc
查看MYVAR環(huán)境變量的值:
[opencloud@server ~]$ echo "$MYVAR" # 輸出:123
此外,也可以使用source命令加載系統(tǒng)級(jí)別的配置文件。這樣,在/etc/bashrc文件中定義的環(huán)境變量、別名等就可以在當(dāng)前的Shell中使用了。
[opencloud@server ~]$ source /etc/bashrc
在Linux操作系統(tǒng)中,環(huán)境變量可以存儲(chǔ)在多個(gè)文件中。將環(huán)境變量分別存儲(chǔ)在這些文件中,可以靈活地管理系統(tǒng)級(jí)別和用戶級(jí)別的配置,確保在不同的登錄會(huì)話中和系統(tǒng)啟動(dòng)時(shí)正確加載環(huán)境變量。以下是常見的存儲(chǔ)環(huán)境變量的文件及其用途。
(1)系統(tǒng)級(jí)別文件
① /etc/environment:存儲(chǔ)適用于所有用戶的系統(tǒng)級(jí)別環(huán)境變量。
② /etc/profile:在系統(tǒng)啟動(dòng)時(shí)加載,適用于所有用戶,可以存儲(chǔ)全局的環(huán)境變量。
③ /etc/bashrc:系統(tǒng)級(jí)別的Bash配置文件,用于設(shè)置Bash的默認(rèn)行為。
(2)用戶級(jí)別文件
① ~/.bashrc:在用戶登錄系統(tǒng)時(shí)加載,用于存儲(chǔ)用戶特定的環(huán)境變量。
② ~/.bash_profile:在用戶登錄系統(tǒng)時(shí)加載,可用于存儲(chǔ)用戶特定的環(huán)境變量。
③ ~/.bash_login:類似于 ~/.bash_profile,在用戶登錄時(shí)加載,用于設(shè)置環(huán)境變量。
④ ~/.bash_logout:在用戶退出系統(tǒng)時(shí)加載,可用于清理或保存會(huì)話信息。
如果想修改系統(tǒng)級(jí)別的環(huán)境變量,則建議修改/etc/profile文件。如果想修改Bash的默認(rèn)行為,則建議修改/etc/bashrc文件。
- 電腦組裝與系統(tǒng)安裝
- Red Hat Enterprise Linux 8系統(tǒng)管理實(shí)戰(zhàn)
- Hands-On DevOps with Vagrant
- 精解Windows8
- 嵌入式操作系統(tǒng)(Linux篇)(微課版)
- OpenStack系統(tǒng)架構(gòu)設(shè)計(jì)實(shí)戰(zhàn)
- 新編電腦辦公(Windows 10+ Office 2013版)從入門到精通
- Cassandra 3.x High Availability(Second Edition)
- Introduction to R for Quantitative Finance
- 從實(shí)踐中學(xué)習(xí)Windows滲透測(cè)試
- Linux應(yīng)用大全 基礎(chǔ)與管理
- Office 365 User Guide
- OpenStack Essentials(Second Edition)
- Linux內(nèi)核分析及應(yīng)用
- Website Development with PyroCMS