Linux Bash Shell編程(四):變量(上) 變量分類與相關操做

Linux Bash Shell編程(四):變量(上) 變量分類與相關操做

上一節,咱們瞭解了Bash中的重定向以及特殊符號,從本節開始咱們來一塊兒探索Bash中變量的奧祕。本節咱們先來了解下Bash中變量的基本知識以及對變量處理的操做方法。本節的部份內容(特殊符號等)在上一節中有敘述,不清楚的同窗能夠參閱上一節內容。shell

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表明第一到第九個參數,第十以上參數用大括號包含,第十個: 19{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變量相關內容,學習變量的數值運算與運算符、變量測試與內容替換、環境變量配置文件相關知識

  上一節,Linux Bash Shell編程(三):重定向、多命令順序、通配符、特殊符號

相關文章
相關標籤/搜索