1. 程式人生 > >Shell高階程式設計學習筆記(基礎篇)

Shell高階程式設計學習筆記(基礎篇)

目錄

  1.shell指令碼的執行方法   2.shell的變數型別   3.shell特殊變數


4.變數子串的常用操作   5.批量修改檔名實踐    6.變數替換


7.在shell中計算字串長度的方法    8.變數的數值計算:(()) 的用法


9. 變數的數值計算:let的用法    10.變數的數值計算:expr的用法


11.變數的數值計算:bc的用法      12.條件測試的多種方法


13.字串測試操作符          14.整數二元比較操作符


15.邏輯操作符              16.利用shell知識製作單級及多級選單


17.case結構條件語句       18. 當型迴圈和直到型迴圈


19.for迴圈

1.shell指令碼的執行方法 

當shell指令碼以非互動的方式執行時,它會先查詢環境變數ENV,該變數指定了一個環境檔案(通常是.bashrc),然後從該環境變數檔案開始執行,當讀取了ENV檔案後,SHELL才開始執行shell指令碼中的內容。

shell指令碼的執行通常可以採用以下三種方法:

  1. bash script-name 或者 sh script-name
  2. path/script-name 或者 ./script-name(當前路徑下執行)
  3. source script-name 或 . script-name(注意符號“.”與 script-name之間有空格)

第一種方法是指令碼檔案本身沒有可執行許可權時,通常使用的方法;

第二種方法需要先將指令碼檔案的許可權改為可執行,然後通過指令碼路徑就可以直接執行;

第三中方法是在當前shell環境中直接執行,而不是新建立一個子shell,當我們需要在一個指令碼中使用另一個指令碼中的變數的時候就使用第三種方法,例如建立如下指令碼,其中定義了chars變數:

通過上面三種方法執行:

可以看出方法1,2執行指令碼是系統會自動新建立一個子shell,執行之後,其變數不會在當前shell有效,而第三種方法是告訴系統讓這個指令碼直接在當前shell執行,顯然其定義的變數chars在當前shell中也是有效的,所以需要在某個指令碼中使用另外一個指令碼中的變數時,需要使用第3中方法執行指令碼。

2.shell的變數型別 

shell中的變數分為環境變數和全域性變數

  環境變數也稱為全域性變數,可以在建立他們的shell及其派生的任意子程序shell中使用。區域性變數只能使用在建立它們的shell函式或指令碼中使用。

  環境變數用於定義Shell的執行環境,保證shell命令的正確執行,shell通過環境變數來確定登入使用者名稱,命令路徑,終端型別,登入目錄。環境變數可以在命令列中設定,但使用者退出時這些變數值也會丟失,因此最好在使用者家目錄下的.bash_ptofile檔案會全域性配置/etc/profile檔案或者/etc/profile.d中定義,將環境變數放入profile中,每次使用者登入,這些變數值都將被初始化。

  傳統上,所有環境變數均為大寫。環境變數用於使用者程序前,必須用export命令匯出。

  有一些環境變數,比如HOME,PATH,SHELL,UID,USER等在使用者登入之前就已經被/bin/login程式設定了,通常環境變數的定義並儲存在使用者的家目錄下的./bash_profile檔案中。

  已經定義的變數可以用unset在取消定義。

本地變數定義的三種方式:

var_name=value

var_name='value'

var_name="value"

下面看看這三種方式的區別

第一種方法是直接定義變數內容,但是內容必須連續,中間不能有空格字元;

接著看下面:

第二種方法通過單引號定義變數,只會原樣輸出字串內容,而不會對字串中的變數和特殊字元進行解析,適合定義單純字元顯示;

第一種和第三種,輸出時,會對內容進行解析,輸出解析後的內容,有於第一種方法不能定義不連續的變數,所以通常在需要解析的時候都加上雙引號,而很少使用第一種方法,第一種方法一般僅僅用來定義連續的數字或者路徑。

3.shell的特殊變數 

位置變數

$0$0 獲取當前執行指令碼的檔名,包括路徑;

$n$n,獲取當前執行的shell指令碼的第n個引數,n=1,...,9,如果 n 大於9, 使用大括號${10};

$$∗ 獲取當前shell的所有引數,將命令列引數視為單個字串,相當於"$1$2$3...$n""$1$2$3...$n"

$$# 獲取當前shell指令碼或者命令列引數的總個數;

$$@ 這個程式的所有引數 "$1""$2""$3""...","$1""$2""$3""...",這是將引數傳遞給其他程式的最佳方式,因為它會保留所有內嵌在每個引數裡的任何空白。

  程序狀態變數

$$$$ 獲取當前shell的程序號(PID)

$$? 獲取上一個指令的返回值(0 為成功,非零為失敗)

4.變數子串的常用操作 

常用操作
編號 表示式 說明
1 ${#string} 返回$string的長度
2 ${string:position} 在$string中,從位置position之後開始提取子串
3 ${string:position:length} stringpositionstring中,從位置position之後開始提取長度為length的子串
4 ${string#substring} 從變數stringstring開頭刪除最短匹配substring子串
5 ${string##substring} 從變數stringstring開頭刪除最長匹配substring子串
6 ${string%substring} 從變數stringstring結尾刪除最短匹配substring子串
7 ${string%%substring} 從變數stringstring結尾刪除最長匹配substring子串
8 ${string/substring/replace} 使用replacereplace來代替第一個匹配的substring
9 ${string//substring/replace} 使用replacereplace來代替所有匹配的substring
10 ${string/#substring/replace} 如果stringstring字首匹配substring,就用replacereplace來代替匹配的字串substring
11 ${string/%substring/replace} 如果stringstring字尾匹配substring,就用replacereplace來代替匹配的字串substring

舉例說明如下:

5.批量修改檔名實踐 

例如有下面的檔案:

現在想要將字尾前部改為大寫JPG:

方法一:

#!/bin/bash
for obj in $(ls *.jpg)
do
    mv ${obj} $(echo ${obj/%jpg/JPG})
done

方法二:

rename 's/jpg$/JPG/' *.jpg

相關推薦

no