Linux學習第六篇 取其一點看shell

來源:互聯網
上載者:User

1.  Shell中的變數類型

Shell中的變數可以分為環境變數、位置變數、預定義的特殊變數以及使用者自訂變數、

Shell中的環境變數是一類Shell預定義變數,是用於設定系統運行環境的變數,環境變數由系統統一命名。部分系統變數的值由系統設定,部分環境變數的值可以由使用者給定。

環境變數的名稱由大寫字母組成,常用的Shell環境變數如下所示:

HOME: 使用者主目錄的全路徑名,cd $HOME 即可切換到使用者的主目錄

PATH: 類似於windows下的路徑,Shell會在裡面依次尋找二進位的可執行檔。

       echo $PATH可以顯示當前的PATH,添加新的PATH方法 $PATH=$PATH:新PATH

TERM:  終端類型 echo $TERM

PS1:   提示符,root使用者預設為#,普通使用者預設為$

SHELL: Shell解譯器的絕對路徑

LOGNAME: 登入使用者的使用者名稱

UID:  目前使用者的UID   echo $UID

位置變數是根據出現在命令列上的參數的位置確定的變數,在調用Shell程式的命令列中,參數的位置定義如下所示。

   $命令  參數1   參數2  參數3

其中 $0  對應  執行的命令名

      $1  對應  參數1

      $2  對應  參數2

      $3  對應  參數3

預定義的特殊變數有著特殊的含義,使用者不可以更改,所有的預定義變數都由“$”符號和另外一個符號組成,常用的預定義特殊變數如下所示

$#: 位置參數個數(不包括Shell指令碼名)

$*:  位置參數組成的字串

$!:   上一個後台命令對應的進程號

$?:   上一個命令的退出狀態,為十進位數字,如果返回為0,則代表執行成功。

$$:   當前的進程號PID

要求: 變數名由字母或者底線開頭,後面跟任意數量的字母、數字、底線。

合法的:_name    SIZE    my_idea

有兩個內建的命令declare和 typeset 可用於建立變數。通過命令的選項設定還可以設定變數的建立方。

變數賦值和引用

Shell編程中,使用變數無需事先聲明,同時變數名的命名須遵循如下規則: 

#首個字元必須為字母(a-z,A-Z) 
#中間不能有空格,可以使用底線(_) 
#不能使用標點符號 
#不能使用bash裡的關鍵字(可用help命令查看保留關鍵字)

需要給變數賦值時,可以這麼寫: 

 變數名=值 

要取用一個變數的值,只需在變數名前面加一個$
( 注意: 給變數賦值的時候,不能在"="兩邊留空格) 

  

系統提供unset命令可以刪除變數,例如 unset  name

變數的賦值有五種:使用read命令,直接賦值,使用命令列參數,使用命令列的輸出結果,從檔案讀取。

使用read命令 read name

直接賦值
a="hello world"  #等號兩邊均不能有空格存在

使用命令列的輸出結果 echo"A is:" $a

使用命令列參數賦值(這種賦值方法是參數需要經常變化,並且不需要互動時使用)執行時,後面的參數

從檔案中讀入資料 這種方式就適合處理大批量的資料,直接把相應的資料寫入檔案,然後運行指令碼即可。

通常是通過while迴圈一行行讀入資料,即沒迴圈一次,就從檔案中讀取一行資料,直到讀取到檔案的結尾。

例如:

#!/bin/bash

ls *.sh >execfile

while read LINE

do

chmod a+x $LINE

done<execfile

這個指令碼使用了while..do..done 結構,最後一行表示從檔案execfile讀取資料。while read LINE表示 每次迴圈讀入一行資料並賦值給變數LINE.

 

包含字串的時候要用到三種引號,分別是單引號、雙引號和反引號

一、整體引用

1. mv "a ~file name.txt" another.txt 

在這種情況下,單雙引號是沒有什麼區別,它們的意義相同。

二、變數替換

1. echo "The value of '${var}' is ${var}". 

在這種情況下,當一個變數被用在雙引號括起來的句子裡面的時候,它會被替換成它的內容;而當使用單引號的時候,變數替換則不會發生。所以可以說單引號是更強的引用。像上面那個例子的輸出結果為:

1. The value of '${var}' is bbb. 

三、命令替換

1. var='uname -r' 

這樣,變數$var的值就是命令uname-r的輸出。

比變數替換更進階的是匹配,例如:${f%jpg}是用jpg對變數f從後面開始進行匹配,並把匹配上的部分(也就是副檔名)去掉,同時使用兩個百分比符號的時候,表示使用了最大匹配方式,比如"abcdabcd",在用a*d匹配的時候,如果是最大匹配,就會匹配所有8個字元,而用最小匹配的時候則會匹配4個。與百分比符號相對應,也可以使用"#"來對變數進行從前向後的匹配,同樣也可以用兩個來表示最大匹配。

來看個例子

1. #!/bin/bash  

2. for var in *.sh 

3. do  

4. echo "${var%sh}" 

5. done  

結果如下

1. test1.  

2. test2.  

3. test3.  

4. test.  

看到了尾碼都沒有了,可以用以修改尾碼名

1. #!/bin/bash  

2. for var in *.sh 

3. do  

4. mv "${var}""${var%sh}SH"  

5. done  

這樣小寫sh就變成大寫的了

 

echo

echo hello #
沒有變數引用, 只是個hello字串.
echo $hello
echo ${hello}    // 同上.
echo "$hello"
echo "${hello}"
hello="A B C D"
echo $hello # A B C D
echo "$hello" # A B C D 

echo '$hello' # $hello

 

 let
  let a=16+5

參考:多處,歡迎補充

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.