天天看點

【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考

文章目錄

  • 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中有不同的作用,下面會詳細說明下。

【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考

(3)單引号和雙引号的差別

單引号不可識别特殊文法

雙引号可以識别特殊文法

詳情參見 【Linux】Shell(Bash)單引号、雙引号、不加引号和反引号用法和差別詳解

【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考

(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、引用變量的方法

定義好變量後該如何使用呢?使用一個定義好的變量隻需要在變量前面加上 $ 符号即可。

【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考

可以看出帶不帶{}對變量進行輸出時,輸出結果都是一樣的,但是一般情況下最好帶上{},這樣能很明确的看到變量名的界限。

當你的變量後面已經沒有其他字元了或者後面是空格,加不加{} 都一樣

[[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)自定義變量

自定義變量就是我們平常用的最多的變量,定義自定義變量的方法為 變量名=變量值,我們可以對變量的名字自定義,但是必須要符合命名規則。

【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考

(2)環境變量

環境變量又可以叫做全局變量,定義環境變量時,需要使用

export

去聲明。(和自定義變量的差別,自定義變量時局部變量,其變量的範圍是僅在目前的Shell中生效,環境變量又可被叫做全局變量,其變量的範圍是會在目前Shell和其子Shell中都生效)

【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考

為什麼叫環境變量?因為你可以通過

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 "顯示傳遞到腳本的參數的個數:$#"               
           

運作結果:

【Linux】變量定義規則、shell 格式、空格注意事項彙總、env和set差別1. 空格問題2. 變量參考

(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–變量

繼續閱讀