Introduction to Unix part 3 Shell Script
使用者環境與起始檔 內容: Shell環境運作 Shell的種類 Shell Script Programming
Shell 環境運作 Shell 運作程序 出現 提示符號(”%” 記號)準備接受命令。 使用者(或終端機傳輸)輸入命令。 依照 PATH 變數,尋找命令位置。 PATH裡面存著命令所存放的目錄, ex:PATH=/usr/local/bin:/usr/sbin (分隔符號為:) 解譯並執行命令。 輸出結果或錯誤訊息給使用者。 再出現 Prompt 準備接受下一個命令。 Q: 為什麼在pads1執行我寫好的prgram calc, 必須要./calc呢? A: 因為你的PATH裡面沒有存著現在目錄(.), 所以系統去PATH變數找不到calc的目錄, 只要將.也加入PATH裡, 之後就可以只輸入calc執行
外殼與核心 系統核心 外殼 系統程式與系統函數所構成 外殼工具 Bourne Shell (sh) Korn Shell (ksh) Bourn Again Shell (bash) C Shell (csh) TC Shell (tcsh)
使用者環境 環境變數 檢視環境變數 變更環境變數 echo $PATH export PATH=$PATH:. (將目前目錄存到PATH中) 要使用任何的shell變數都必須要加$ 使用export設定變數的值只會在這次登入有效, 下次登入必須重新設定 (所以將export PATH=$PATH:.寫在shell初始設定檔.tcshrc) Note: 使用pads1的人請寫在.bashrc; cs工作站沒有export指令 變 數 範 例 說 明 HOME /user/dr961/d9662828 使用者家目錄 PATH /usr/local/bin:/bin: 搜尋命令路徑 PWD /bin 目前工作目錄位置 SHELL /bin/bash 登入外殼程式(環境) USER nien 使用者登入名稱
Shell Script 程式簡介 何謂 Shell script 相當於dos裡的批次檔 Shell script (命令稿) 將欲連續執行多個命令寫在file裡 通常副檔名為.sh Shell script (命令稿) 多個外殼命令 + 變數 + 程式控制結構 外殼命令 ls, cp, cat, mkdir, …. 程式控制結構 if, while, for,….. 變數 環境變數, 自訂變數, 位置變數 example.sh mkdir test2 cp test1/* test2 rm –r test1
除了第一行的『 #! 』是用來宣告 shell 的之外,其他的 # 都是『註解』用途 Shell Script 程式簡介 和c program的差別 Script為interpreted languages; 而c program必須先透過compiler編譯成可執行檔 通常第一行 為#!/bin/sh 宣告這個 script 使用的 shell 名稱,讓系統知道該程式需要使用什麼 shell 來執行 除了第一行的『 #! 』是用來宣告 shell 的之外,其他的 # 都是『註解』用途
Shell Script 程式簡介 Shell script 執行 步驟 1:利用 pico 編輯程式 步驟 2:設定成可執行檔 pico hello.sh 步驟 2:設定成可執行檔 chmod +x hello.sh 步驟 3:執行 shell script 程式 hello.sh
Shell Script 程式簡介 Shell script 變數 自訂變數: 可自己隨意設定變數, 如同在c program可宣告任意名字的變數, 在shell裡變數預設為string a=5 echo “intger = $a” 要使用此變數時, 必須在變數前加$
輸入輸出語法 輸出敘述 – echo 輸入敘述 – read echo “Good lucky to you” 相當於C program裡的printf 一定會換行 輸入敘述 – read echo “What is your name =>” read name 會將使用者的輸入存到name 相當於C program裡的scanf
輸入輸出範例
位置變數: 在命令列時, 給此script的參數 Shell Script 程式簡介 Shell script 變數 位置變數: 在命令列時, 給此script的參數 $0~$9; $#代表有幾個參數; $*存著給script的參數們 $0代表script本身 ex: source hello.sh good job $0=hello.sh , $1=good, $2=job, $#=2, $*= good job
位置參數的範例
expr: 在shell中的四則數學運算, 必須使用此指令來執行 數值運算 expr: 在shell中的四則數學運算, 必須使用此指令來執行 expr 5 + 2 在 + - * / 的二邊都有空白,如果沒有空白將產生錯誤: 若要將expr的運算結果assign給某個變數, 則必須用`(在!左邊的按鍵)將expr的運算包起來 sum=`expr 5 + 2` 特別注意*為萬用字元, 必須使用跳脫字元\來表示*在此為乘法 mul= `expr 5 \* 2`
數值運算範例
數值運算範例輸出結果
選擇性結構敘述 條件敘述 數值比較:運算所傳回的結果是true或false 以下兩種寫法等價, 所以你可以任意選擇test或[]的寫法 test integer1 –eq integer2 [ integer1 –eq integer2 ] 中括號前後要有空白 比較旗號 說 明 -eq (equal) 等於(若兩數相等則傳回 true,否則為 false) -ne (not equal) 不等於(!=) -lt (less than) 小於(<) -le (less or equal) 小於或等於(<=) -gt (greater than) 大於(=) -ge (greater or equal) 大於或等於(>=)
選擇性結構敘述 條件敘述 字串比較 test str1!=str2 [ str1 != str2 ] = != < > -n 比較運算子 說 明 = 比較兩字串是否相符合,如 str1 = str2。 != 不符合(即是兩字串內容不相同),如 str1 != str2。 < 小於(依 ASCII 碼比較大小),如 str1 < str2。 > 大於(依 ASCII 碼比較大小),如 str1 > str2。 -n 不是空字串(字串長度大於 0),如 –n str1。 -z 空字串(字串長度為 0),如 –z str1。
選擇性結構敘述 條件敘述 檔案屬性測試 test –d file_1 [ -d file_1] -d 如果是目錄則傳回真。 -e 選 項 說 明 -d 如果是目錄則傳回真。 -e 如果檔案存在則傳回真。 -f 如果檔案存在並且是一般檔案則傳回真。 -g 如果檔案存在並且是特定群組可執行的,則傳回真。 -r 如果檔案存在並且可讀的,則傳回真。 -s 如果檔案存在且存有資料,則傳回真。 -w 如果檔案存在且可寫入資料,則傳回真。 -x 如果檔案存在且可執行,則傳回真。 -nt 比較兩檔案是否較新(修改時間),如 file1 –nt file2。 -ot 比較兩檔是否較舊,如 file1 –ot file2。
選擇性結構敘述 if 程式結構 標準格式 簡單格式 最簡潔格式 if 條件判斷 then 命令敘述區段 fi 若要把下一行的程式, 寫到上一行, 必須用分號隔開 if 條件判斷; then 命令敘述區段 fi if 條件判斷; then; 命令敘述區段; fi
if程式結構
if搭配著測試字串的範例
if 搭配著測試file的範例
選擇性結構敘述 case 程式結構 case variable in pattern_1) 命令敘述區塊 ;; pattern_2) statement 1 statement 2 statement 3;; pattern_3) 命令敘述區塊 ;; ….. pattern *) esac 1. case的結尾是esac 2.每個選項間要用;;作區隔 3. 最後一個選項*代表著不符合以上的選項, 都會進到這裡來, 等於c program的default 4. variable可以隨意命名
case的範例
重複性結構敘述 for 迴圈結構 for var in List do commands done 所以List可以由 一堆string以空白隔開組成 var可以隨意命名 var在for迴圈執行的過程, 會從List裡取值 ex: for var in “how are you” 1st loop var=how 2nd loop var=are 3rd loop var=you 總共執行3次
Q: 此program代表什麼意義?
重複性結構敘述 while 迴圈結構 while 條件判斷 do 命令區塊 done
本週練習 此次練習有兩個版本, 一個簡單, 一個比較困難 可自行挑選要實作出哪個版本 完成版本1: 70分 完成版本2(step1~step3): 90分 完成版本2(step1~step5): 100分
step1:使用者在執行script時, 會給數個參數 練習3 (版本1) step1:使用者在執行script時, 會給數個參數 ex: practice.sh test1 test2 step2: 根據使用者給的參數, 在家目錄尋找是否有此目錄, 若是, 請列出此目錄裡面的所有檔案
step3: 讓使用者輸入某個檔案名, 查詢此檔案是否為可執行檔 練習3 (版本2) step1: 使用者在執行script時, 會給一個參數, 是一個目錄名稱(要真實存在的目錄, 且目錄下有3個以上的檔案, 此目錄在家目錄下) ex: practice.sh test1 step2: 列出此目錄下的檔案 step3: 讓使用者輸入某個檔案名, 查詢此檔案是否為可執行檔 可以讓使用者一直輸入, 直到使用者輸入stop才停止輸入
step4: step3的迴圈停止後, 列出剛剛使用者所查詢的檔案 Ex: list=“$list $name” 使用list變數來存使用者所輸入的檔案, 最簡單的方式是將原本list和name這兩個string相加, 再重新assign給list變數 step5: 跳出選單讓使用者選擇要輸入哪個檔案, 且如何處置此檔案 選項1: 在此檔案搜尋是否有hello字串 選項2: 將此檔案copy至家目錄下 選項3: 將此檔案刪除
版本2的輸出