【學習筆記】Shell-1 變數:命名規範、變數賦值/取值/取消、局部變數/全局變數、預設環境變數

1.Shell變數 

從變數的實質上來說,變數名是指向一片用於存儲數據的記憶體空間。

Shell變數是一種弱類型的變數,即聲明變數時不需要指定其變數類型,也不需求遵循「先聲明再使用」的規定,想用即可用。

 

2.命名規範、變數賦值、變數取值、取消變數

2.1 變數名命名規範:

2.2.1 由英文字母、數字、下劃線組成,不能以數字開頭

2.2.2 區分大小寫

2.2.3 不能使用bash的關鍵字--疑問:怎麼查看bash的所有關鍵字?

2.2 變數賦值:

2.1.1 var_name1=studing               #變數名=變數值,=兩邊無空格

2.1.2 var_name2='shell studing'     #變數值中有空格時必須使用引號括起,單、雙引號都可以

2.1.3 var_name3="$var_name1"  或 var_name3=$var_name1   #如果變數值引用的是其他變數,則不能使用單引號括起

[root@testserver ~]# var_name1=studing
[root@testserver ~]# var_name2='shell studing'
#var_name3引用var_name1的值
[root@testserver ~]# var_name3=$var_name1 [root@testserver ~]# echo $var_name3 studing [root@testserver ~]# var_name3='$var_name2' [root@testserver ~]# echo $var_name3 $var_name2 [root@testserver ~]# var_name3="$var_name2" [root@testserver ~]# echo $var_name3 shell studing [root@testserver ~]#

2.3 變數取值:變數名前加$,如$var_name 或 ${var_name},兩種方式都可以,推薦使用${var_name}。

2.4 取消變數:將變數從記憶體中釋放,語法:unset 變數名/函數名

[root@testserver ~]# echo $var_name3
shell studing
[root@testserver ~]# unset var_name3
[root@testserver ~]# echo $var_name3

[root@testserver ~]#

 

3.局部變數、環境變數

3.1 局部變數

其作用域只在聲明它的Shell中,對其他Shell無效。每個Shell有自己的變數空間,彼此互不影響。

例如:打開兩個Shell窗口,如下圖:

 

3.2 環境變數:即全局變數。

使用export命令將當前Shell的變數導出為環境變數,可用於子Shell繼承、使用。子Shell、父Shell切換方法:在當前Shell中輸入bash並回車,即進入了子Shell;在子Shell中輸入exit即退出子Shell返回到父Shell。

export命令語法:export VAR=value #VAR變數名,value值,等號兩邊無空格

從如下示例中,可以看出:環境變數可從父Shell傳給子Shell,但子Shell的環境變數不能傳給父Shell。

步驟:

1.登錄Shell,即為父Shell,輸入bash進入子Shell

2.=兩邊有空格,執行命令報錯

3.在子Shell中定義變數VAR,並導出為環境變數

4.輸入bash進入子Shell的子Shell,可稱為孫Shell

5.輸出子Shell中定義的變數VAR

6.輸入exit退出孫Shell

7.輸入exit退出子Shell

8.在父Shell中輸出子Shell中定義的變數VAR,為空

 

 

 

 

 

 

 

 

 

 

 

4.常見的bash預設環境變數

變數BASH:Bash Shell的全路徑

[root@testserver ~]# echo $BASH

/bin/bash

變數BASH_VERSION:Bash Shell的版本

[root@testserver ~]# echo $BASH_VERSION 
4.1.2(2)-release

變數CDPATH:用於快速進入某個目錄。

示例:如/usr/local/shell_studying/test_shell目錄,每次進入test_shell目錄需輸入很長的路徑。定義變數CDPATH='/usr/local/shell_studying/',執行cd test_shell時在當前目錄查找是否有該目錄,沒有則進入CDPATH定義的目錄中的test_shell目錄,如下:

[root@testserver ~]# CDPATH='/usr/local/shell_studying/' 
[root@testserver ~]# cd test_shell 
/usr/local/shell_studying/test_shell 
[root@testserver test_shell]#

變數EUID:記錄當前用戶的UID。root用戶的UID為0

[root@testserver ~]# echo $EUID 
0

變數FUNCNAME:在用戶函數體內部,記錄當前函數體的函數名。

示例:創建funcname.sh文件並執行。

[root@testserver shell_studing]# cat funcname.sh 
#!/bin/bash
funcname(){
        echo $FUNCNAME
}
funcname
[root@testserver shell_studing]# chmod +x funcname.sh 
[root@testserver shell_studing]# ./funcname.sh 
funcname
[root@testserver shell_studing]# 

變數HISTCMD:記錄下一個命令在history命令中的編號。

示例:執行history命令後,最近1條命令的編號是1009,執行echo $HISTCMD命令的編號為1010,所以下一條命令的編號為1011。

[root@testserver shell_studing]# history
....
1008  2020-05-08 15:47:37 root ./funcname.sh 
1009  2020-05-08 15:49:36 root history
[root@testserver shell_studing]# echo $HISTCMD
1011

變數HISTFILE:記錄history命令記錄文件的位置。

[root@testserver ~]# echo $HISTFILE
/root/.bash_history

變數HISTFILESIZE:設置HISTFILE文件記錄命令的行數。限制歷史命令記錄的行數。

[root@testserver ~]# echo $HISTFILESIZE
1000

變數HISTSIZE:命令緩衝區的大小。執行的命令,先記錄在命令緩衝區,在緩衝區滿或退出Shell時才將命令寫入$HISTFILE

[root@testserver ~]# echo $HISTSIZE
1000

變數HOSTNAME:展示主機名。

[root@testserver shell_studing]# echo $HOSTNAME
testserver

變數HOSTTYPE:展示主機的架構。如i386、i686、x86_64等。

[root@testserver shell_studing]# echo $HOSTTYPE
x86_64

變數MACHTYPE:主機類型的GNU標識。一般為「主機架構-公司-系統-gnu」

[root@testserver shell_studing]# echo $MACHTYPE
x86_64-redhat-linux-gnu

變數LANG:設置當前系統的語言環境。

[root@testserver shell_studing]# echo $LANG
en_US.UTF-8
[root@testserver shell_studing]# export LANG=zh_CN.UTF-8

變數PWD:記錄當前目錄。

[root@testserver shell_studing]# echo $PWD
/usr/local/testuser/shell_studing

變數OLDPWD:記錄之前的目錄。

示例:當前目錄/usr/local/testuser/shell_studing,cd /root 切換路徑後,/root為當前目錄,則/usr/local/testuser/shell_studing為之前的目錄,即$OLDPWD

[root@testserver shell_studing]# echo $PWD
/usr/local/testuser/shell_studing
[root@testserver shell_studing]# cd /root
[root@testserver ~]# echo $OLDPWD
/usr/local/testuser/shell_studing
[root@testserver ~]# 

變數PATH:代表命令的搜索路徑。

[root@testserver ~]# echo $PATH
/usr/local/module/maven-3.1.1/bin:/usr/local/jdk/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/maven/apache-maven-3.3.9/bin:/root/bin
#設置PATH變數,新增路徑/usr/local/testuser/至PATH
[root@testserver
~]# export PATH=/usr/local/testuser/:$PATH [root@testserver ~]# echo $PATH /usr/local/testuser/:/usr/local/module/maven-3.1.1/bin:/usr/local/jdk/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/maven/apache-maven-3.3.9/bin:/root/bin [root@testserver ~]#

變數PS1:命令提示符。\u是用戶名,\h是主機名,\W是當前工作目錄,\$是UID的替換字元:如UID為0,則替換成#(root用戶),否則替換成$。

[root@testserver ~]# echo $PS1
[\u@\h \W]\$

其他變數:通過執行 man bash 查看man文件,在Shell Variable中查看(下圖截取部分命令)。

 

【學習參考文檔】

  1. 書籍:《Linux系統命令及Shell腳本實踐指南》 王軍 著;
  2. Shell教程|菜鳥教程://www.runoob.com/linux/linux-shell.html

 

【寫在末尾】文章如有錯誤之處,歡迎評論指正,非常感謝。

有興趣可關注同名微信公眾號「粒粒的測試筆記」,號內會分享各種測試相關知識,感謝關注。