Linux Bash Shell編程(四):變量(上) 變量分類與相關操做
上一節,咱們瞭解了Bash中的重定向以及特殊符號,從本節開始咱們來一塊兒探索Bash中變量的奧祕。本節咱們先來了解下Bash中變量的基本知識以及對變量處理的操做方法。本節的部份內容(特殊符號等)在上一節中有敘述,不清楚的同窗能夠參閱上一節內容。shell
變量概述
變量是計算機內存單元,其中存放的值能夠變化,Shell腳本將信息存放在變量中,變量有一個名字,能夠方便地引用,能夠保存設置,也能夠保存臨時信息編程
Bash變量設置規則
- Bash中的變量能夠由字母、數字、下劃線構成,但不能以數字開頭
- Bash變量的默認類型是字符串型,若是要進行數值運算,則必須指定變量類型爲數值型或使用特殊運算方法
- 在對變量賦值時,若變量值字符串中有空格,須要將整個值用引號包括,類同上一節
- 使用echo命令輸出變量值時,Shell一樣對變量值進行當場轉義,若在其中使用轉義符
\
請使用-e
參數激活轉義 - 環境變量名一般爲大寫,用戶聲明環境變量時也建議大寫,以便於區分
變量分類
- 用戶自定義變量
- 環境變量:主要保存和系統操做環境相關變量,環境變量不能更名,但能新建
- 位置參數變量:主要用來向腳本中傳遞參數或數據,變量名不能自定義,變量做用是固定的
- 預約義變量:是Bash中已經定義好的變量,變量名不能自定義,變量做用也固定(位置參數變量也是預約義變量的一種)
變量分類介紹與操做
不一樣種類的變量操做大致相同,相同部分在用戶自定義變量操做中寫出,後面再也不贅述數組
用戶自定義變量
-
用戶自定義變量由用戶自由定義修改,通常變量名能夠修改,也可刪除,在不違反Bash變量設置規則的前提下能夠任意建立bash
-
用戶自定義變量僅在當前Shell中有效編程語言
-
聲明變量(定義變量), 語法:
變量名
=變量值
注意,等號兩邊均沒有空格,不然會被Shell識別爲命令而報錯,例如函數test1="Hello" #定義了test1變量並賦值爲"Hello" test2='Hello World!\nI am Zheng' #定義了test2變量並賦值爲一個字符串,並含有轉義符 1test="Hello" #不能這樣定義!!!變量不能以數字開頭,見「變量設置規則」節
注意,第三行聲明的變量名稱非法,變量名不能以數字開頭,第二行的變量值以’'單引號包含,由於其中有!特殊字符,若用雙引號會報錯,單引號消除
!
的特殊含義,詳見上一節學習 -
調用變量,語法:$
變量名
,例如,用echo
命令將上面定義的兩個變量輸出測試zheng@Kali:~$ echo $test1 Hello zheng@Kali:~$ echo $test2 Hello World!\nI am Zheng zheng@Kali:~$ echo -e $test2 #test2變量值中包含轉義符,須要用-e選項激活轉義符 Hello World! I am Zheng
-
變量疊加:在變量後追加一部份內容而前面部分不變,用括號與引號包含原變量並在後面寫入追加內容,注意括號與引號的位置不一樣url
#語法:追加內容以123爲例 test="$test"123 test=${test}123 #示例:在變量test1上追加內容 zheng@Kali:~$ test1="$test1"" World" #追加的內容含有空格,故用引號包含 zheng@Kali:~$ echo $test1 Hello World
-
另外,使用
set
命令能夠查看當前定義的全部變量和函數(不僅是用戶自定義變量)spa -
刪除變量:
unset
命令以刪除變量#語法:unset 變量名 只須要變量名便可 #示例,以刪除test1爲例: unset test1
環境變量
- 一部分爲系統環境變量,沒法修更名稱,只能修改值,做用固定,用戶能夠另行添加環境變量
- 環境變量會在當前Shell和這個Shell的全部子Shell中生效(子Shell是由Shell建立的Shell,可經過命令
pstree
查看進程樹以查看Shell關係) - 將環境變量寫入配置文件,則在全部shell中都永久生效(不寫入配置文件不能永久生效),環境變量配置文件在下一節講到
-
環境變量定義:語法
export
變量名
=值
;將變量聲明爲環境變量export
變量名
export test="Hello" #新定義一個環境變量 export test #將定義的test變量聲明爲環境變量
-
查詢環境變量:命令
env
查詢當前的環境變量 -
調用、刪除同用戶自定義變量。
-
問題:子Shell可否
unset
父Shell聲明的環境變量?能夠,但只是刪除子Shell環境中的環境變量,父Shell中依然存在
經常使用環境變量
$PATH
是系統查找命令的路徑(變量只增長不能覆蓋)。內容爲以冒號分割的路徑,Shell中的命令補全以及執行都按照PATH
環境變量中所指定的目錄尋找
$PS1
其實PS1
變量是環境變量中的子分支,不能用env
命令查看,只能用set
,定義了當前命令提示符樣式
轉義符搭配 | 做用 |
---|---|
\d | 顯示日期 |
\h | 顯示簡寫主機名 |
\t | 顯示24小時制時間"HH:MM:SS" |
\T | 顯示12小時制時間"HH:MM:SS" |
\A | 顯示24小時制時間"HH:MM" |
\u | 顯示當前用戶名 |
\w | 顯示當前所在工做目錄的完整名稱 |
\W | 顯示工做目錄的最後一個目錄 |
# | 顯示當前命令序號 |
$ | 命令提示符,root#;普通用戶$ |
先查看一下當前的PS1
變量值
zheng@Kali:~$ echo $PS1 \u@\h:\w$
能夠按照喜愛對本身的命令提示符顯示格式進行修改,如增長時間等
位置參數變量
-
位置參數變量是預約義變量中的一種,比較少因此單獨討論
-
位置參數變量的變量名及做用是固定的,不能修改其變量名稱,只能對其賦值(無需手動,只須要在命令行後按空格分開附加便可,同其餘命令的參數)
-
位置參數變量的分類及做用
位置參數變量 | 做用 |
---|---|
$n | n爲數字,$0表明腳本自己, 1 − 9 代 表 第 一 到 第 九 個 參 數 , 第 十 以 上 參 數 用 大 括 號 包 含 , 第 十 個 : 1-9表明第一到第九個參數,第十以上參數用大括號包含,第十個: 1−9代表第一到第九個參數,第十以上參數用大括號包含,第十個:{10} |
$* | 表示命令行中的全部參數,$*將全部參數看做一個總體 |
$@ | 也表示命令行中的全部參數,$@將每一個參數區分對待 |
$# | 表示命令行中全部參數的個數 |
- 其中
$*
與$#
的做用乍一看相同,其實略有區分,至關於一個爲總和,而一個爲遍歷集合,在下面的實驗三中直觀地展現了它們的具體區別
實驗:
- 實驗一:簡單位置參數變量傳入實驗
#這是test1.sh腳本文件中的內容,有關腳本文件的建立和執行請移步個人另外一篇博客 Bash Shell編程(一) #!/bin/bash #參數變量腳本測試程序 echo $0 echo $1 echo $2 echo $#
執行test1.sh
並附加以下參數
zheng@Kali:~/Shell$ ./test1.sh Hello "I am Zheng" ./test1.sh # $0 腳本自己 Hello # $1 第一個參數 I am Zheng # $2 第二個參數(包含空格的字符串) 2 # $# 一共輸入了兩個參數
-
實驗二:使用參數進行簡單的加法運算
加法運算的內容暫時超綱,在下一節中會講到
#這是test2.sh腳本文件的內容 #!/bin/bash #加法運算的具體語法在後面講到,必須用兩個括號包含 sum=$(($1 + $2)) echo$sum
具體輸出內容就不在這裏呈現,若是輸入兩個數字,則會返回兩個數字的和
-
實驗三:展現參數
#@
與#*
的區別#這是test3.sh中的內容 #/bin/bash #區分$*與$@ #其中for爲循環語句,在後面會講到,與其餘編程語言中的循環語句相同,相似 Python #本例僅做爲了解兩參數區別使用 x=1 echo '$*' for i in "$*" do echo "The parameter$x is $i" x=$(($x+1)) done x=1 echo '$@' for i in "$@" do echo "The parameter$x is $i" x=$(($x+1)) done
以以下參數執行
test3.sh
腳本,獲得輸出以下,zheng@Kali:~/Shell$ ./test3.sh 123 456 789 $* The parameter1 is 123 456 789 $@ The parameter1 is 123 The parameter2 is 456 The parameter3 is 789
能夠清楚區分,
$*
表示的是參數總和,只有一個;而$@
表示的是各個獨立參數組成的集合,能夠遍歷
預約義變量
-
預約義變量主要存放Shell執行狀態相關的信息
預約義變量 變量做用 $? 最後一次執行的命令的返回狀態,若正確運行則爲0;錯誤退出,則由程序本身定義返回值(非0) $$ 當前進程的進程號(PID) $! 最後一個被放入後臺執行的進程號 - 預約義變量中的
$?
變量就是上一節多命令順序邏輯符號中&&
邏輯與和||
邏輯或中命令是否成功執行的判斷依據 - 在命令行後加
&
能夠將命令放入後臺執行,在後面會講到
- 預約義變量中的
接收鍵盤輸入給變量賦值
主要用read
命令實現
read [選項] [變量名]
選項 | 做用 |
---|---|
-p 「string」 | 顯示提示信息 |
-t time (second) | 指定等待時間(默認永久) ,等待時間結束自動結束輸入 |
-n 字符數 | 接收指定的字符數後,程序就執行 |
-s | 隱藏輸入的數據,適合機密信息的輸入 |
例如:
#如下爲test4.sh文件中內容 #!/bin/bash #read接收鍵盤輸入示例 read -p "Please input your name: " -t 60 name echo "Hello, $name!"
運行如下命令,提示輸入姓名,輸入後回車獲得輸出
zheng@Kali:~/Shell$ ./test4.sh
Please input your name: Zheng
Hello, Zheng!
結尾
下一節,咱們將繼續探索Bash變量相關內容,學習變量的數值運算與運算符、變量測試與內容替換、環境變量配置文件相關知識
輸入示例
read -p "Please input your name: " -t 60 name
echo 「Hello, $name!」
運行如下命令,提示輸入姓名,輸入後回車獲得輸出 ```bash zheng@Kali:~/Shell$ ./test4.sh Please input your name: Zheng Hello, Zheng!
結尾
下一節,Linux Bash Shell編程(五):變量(下)變量運算、內容替換、環境變量配置文件
咱們將繼續探索Bash變量相關內容,學習變量的數值運算與運算符、變量測試與內容替換、環境變量配置文件相關知識