文章目錄
- 1. 空格問題
-
- =号用于指派
- =用于比較
- 2. 變量
-
- 2.1 變量命名的格式要求
- 2.2、shell定義變量中的注意事項
-
- (1)變量名區分大小寫,環境變量建議使用大寫便于區分
- (2)在shell中,變量和值之間`不能有空格`
- (3)單引号和雙引号的差別
- (3) 數字帶引号和不帶引号的差別
- 2.3、引用變量的方法
- 2.4、變量的類型
-
- (1)自定義變量
- (2)環境變量
- (3)位置變量
- (4)系統變量(内置變量)
- 2.5 查找變量env和set差別
- 2.6 清除變量(unset 指令)
- 參考
相關文章:
【Linux】變量定義、shell 格式、空格注意事項彙總
【Linux】Shell(Bash)單引号、雙引号、不加引号和反引号用法和差別詳解
【Linux】 shell 常用的資料類型(數字、字元串和數組)和運算
【Linux】shell中運算符(整數、字元串)
1. 空格問題
=号可以用于指派,也可以在 if 語句中用于比較
shell腳本對空格有嚴格的規定,指派語句等号兩邊不能有空格,而字元串比較,等号兩邊必須有空格。
=号用于指派
shell腳本變量名和等号及等号和值之間不能有空格
,這可能和我們熟悉的所有程式設計語言都不一樣,變量命名須遵循如下規則:
• 首個字元必須為字母(a-z,A-Z)。
• 中間不能有空格,可以使用下劃線(_)。
• 不能使用标點符号。
• 不能使用bash裡的關鍵字(可用help指令檢視保留關鍵字)。
指派語句等号兩邊不能有空格,正例如:
[[email protected] ~]#i=1 # 預設是整數,自動識别
[[email protected] ~]#PROV=BeiJing # 預設是字元串,自動識别
用作指派時,兩邊絕對不能有空格,否則會在相應的行報
command not found
錯誤,此時,shell是把變量當一個指令執行的,而這個指令本身又不存在,反例:
[root@localhost ~]#PROV = BeiJing
執行時會提示:./tt.sh: line 14: PROV: command not found
如果所賦的值包含空格,可以用引号括起來
(沒有空格時也可以用引号,效果和不用一樣),例如:
=用于比較
字元串比較,等号兩邊必須有空格,如:
除了=号,所有的比較符号都要兩側保證空格
,更多的符号可以參見 shell中運算符(整數、字元串)
if [ "${sdpt}" = "sdpt_js" ]; then
注意:[] 中 内容與括号之間也要留一個空格;[] 外側必須無空格,例如那個分号要緊鄰 ]
強烈建議在進行比較時,禁止用單引号,應該使用雙等号 ,因為單引号在 (())語句中表示指派,避免單引号歧義
2. 變量
什麼是變量,簡單的說就是字面意思可變的量,比如a=1就是一個變量,變量就是一個暫時儲存資料的地方,我們通過調用對應的變量名字就可以得到其對應的值。
2.1 變量命名的格式要求
在shell中給變量命名時有以下幾個規則。
(1)shell變量的命名隻能使用英文字母,數字和下劃線,并且開頭不能以數字開始。
(2)shell變量的命名中不能使用标點符号
(3)不能使用bash裡的關鍵字(可用help指令檢視保留關鍵字)。
正确的變量名:Name、name、_name
錯誤的變量名:3Name(首字母不能時數字)、na?me(不能帶除了下劃線外的其他标點符号)
2.2、shell定義變量中的注意事項
(1)變量名區分大小寫,環境變量建議使用大寫便于區分
(2)在shell中,變量和值之間 不能有空格
不能有空格
即等号左右兩側不能有空格,如果變量需要有空格則需要使用引号,單引号和雙引号在shell中有不同的作用,下面會詳細說明下。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyMWMlF2YlRzYyczMlVGZ4UTNhRjZmdTN3gzNjhjZlJ2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(3)單引号和雙引号的差別
單引号不可識别特殊文法
雙引号可以識别特殊文法
詳情參見 【Linux】Shell(Bash)單引号、雙引号、不加引号和反引号用法和差別詳解
(3) 數字帶引号和不帶引号的差別
數字帶引号和不帶引号本質沒有差別,嚴格來說 a=10 和 a=‘10’ 是一樣的,預設都是字元串格式,但是數字形式字元串可以用于計算,而字母形式字元串不可以用于計算
a=10
b='10'
c=10
d='10'
if [ $a == $b ];then
echo 'a==b' # 執行列印
else
echo 'a!=b'
fi
if [ $a == $c ];then
echo 'a==c' # 執行列印
else
echo 'a!=c'
fi
if [ $b == $d ];then
echo 'b==d' # 執行列印
else
echo 'b!=d'
fi
echo "a+1=`expr $a + 1`" #列印 a+1=11
echo "b+1=`expr $b + 1`" # 列印 b+1=11 ,說數字類型的字元串可以用于計算
2.3、引用變量的方法
定義好變量後該如何使用呢?使用一個定義好的變量隻需要在變量前面加上 $ 符号即可。
可以看出帶不帶{}對變量進行輸出時,輸出結果都是一樣的,但是一般情況下最好帶上{},這樣能很明确的看到變量名的界限。
當你的變量後面已經沒有其他字元了或者後面是空格,加不加{} 都一樣
[[email protected] ~]$ A="he is a teacher"
[[email protected] ~]$ echo "${A}" #此時可以不用{}
[[email protected] ~]$ echo "${A} , a good teacher" #此時可以不用{}
但是如果變量後面不是空格,還有其他字元,必須加{},進行邊界限定:
[[email protected] ~]$ A="he is a teach"
[[email protected] ~]$ echo "${A}er" # 此時必須用{}
2.4、變量的類型
常見 Shell 變量的類型包括:自定義變量、環境變量、位置變量、預定義變量
(1)自定義變量
自定義變量就是我們平常用的最多的變量,定義自定義變量的方法為 變量名=變量值,我們可以對變量的名字自定義,但是必須要符合命名規則。
(2)環境變量
環境變量又可以叫做全局變量,定義環境變量時,需要使用
export
去聲明。(和自定義變量的差別,自定義變量時局部變量,其變量的範圍是僅在目前的Shell中生效,環境變量又可被叫做全局變量,其變量的範圍是會在目前Shell和其子Shell中都生效)
為什麼叫環境變量?因為你可以通過
env
指令檢視所有的環境變量 ,或者通過
env | grep xxx
進行搜尋
(3)位置變量
位置變量就是bash将傳遞給腳本的參數,按照位置不同,儲存在不同的位置變量中,以便于腳本調用這些變量,位置變量屬于預定義變量的一種,常見的位置變量有 n ( n 代表數字)、 n(n代表數字)、 n(n代表數字)、*、 @ 、 @、 @、#。
$n:$0表示腳本的名稱、$1-n代表裡面的參數,10以上的參數需要大括号表示比如:{10}
$*:顯示向腳本傳遞的所有參數,但是會把所有的參數看成一個整體
$@:顯示向腳本傳遞的所有參數,但是會把每個參數單獨進行展示
$#: 表示傳遞到腳本的參數的個數
示例,建立一個腳本,命名為 wzbl.sh:
#! /bin/sh
echo "shell腳本名字:$0"
echo "參數1:$1"
echo "參數2:$2"
echo "參數3:$3"
echo "參數4:$4"
echo "參數5:$5"
echo "參數6:$6"
echo "參數7:$7"
echo "參數8:$8"
echo "參數9:$9"
echo "參數10:${10}"
echo "所有的參數,以一個字元串顯示:$*"
echo "所有的參數,區分每個字元串顯示:$@"
echo "顯示傳遞到腳本的參數的個數:$#"
運作結果:
(4)系統變量(内置變量)
預定義變量也是Bash中已經定義好的變量,變量名不能自定義,變量作用是固定的。常見的預定義變量有
$?、$$、$!
。
- $?:前一條指令執行後的傳回狀态,
。傳回值為0表示執行正确,傳回任何非0值均表示執行出現異常
【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考 -
$$:傳回目前程序的程序号(PID)
腳本:
運作結果:#! /bin/bash echo "輸出目前程序的程序号(PID):$$"
【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考 - $!:傳回最後一個背景程序的程序号(PID)
【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考
2.5 查找變量env和set差別
env是檢視所有的環境變量,即通過export導出的變量
而set是檢視所有的變量,包含env和使用者自定義的變量,是以env是set的子集。
可以通過 evn | grep xxxx 或 set | grep xxx進行搜尋
2.6 清除變量(unset 指令)
清除變量可以通過unset 指令,該指令後跟變量的名稱(不用加上變量引導符$),當變量清除後其值為空。
例如建立一個變量後通過echo指令輸出該變量,然後在通過unset指令清除後再次輸出該變量:
[[email protected] ~]$ words="Linux is an operating system"
[[email protected] ~]$ echo $words
Linux is an operating system
[[email protected] ~]$ unset words
[[email protected] ~]$ echo $words #此時輸出空
參考
shell 腳本中 空格的注意問題:= 指派兩邊不能有空格,而if比較判斷時 = 兩邊必須加空格
Shell變量指派語句不能有空格
Linux與Shell學習–shell系列3–變量