在變量名前面添加$可以引用變量的值。若此時變量沒有被定義或變量的值為空,則使用$符號進行變量替換會得到一個空的字符串。而Shell可以提供一些高級形式的變量替換,可以基于變量的狀態來操作變量的值。
案例:寫一個調用編輯器文本文件,并在編輯以后顯示文件內容的腳本,它接受三個命令行參數,分別是要操作的文本文件的路徑、編輯文件所用的編輯器以及顯示文本文件內容的顯示程序。
#!/bin/bash#定義腳本使用函數help(){ echo echo "Usage:`basename $0` [ OPTION ] -f File" echo "Edit a Editable File using specified Editor and Pager." echo echo -e " -e [ Editor ]/tEditor to edit the file:vim,pico,emacs,nano..." echo -e " -p [ Pager ]/tPager to view the file:less,more,cat,head..." echo exit 1}#關閉診斷信息#OPTERR=0#處理命令行選項和參數while getopts f:e:p: OPTIONdo case "$OPTION" in f) #每一個選項的參數可以使用變量$OPTARG來訪問TARGET_FILE="$OPTARG";; e) EDITOR="$OPTARG";; p) PAGER="$OPTARG";; /?) #當遇到未知選項時,顯示腳本的使用方法help;; esacdone #文件參數必須被設置if [ -z "$TARGET_FILE" ]then help fiecho#確保文件是可讀、可寫的if [ -r "$TARGET_FILE" -a -w "$TARGET_FILE" ]then #詢問用戶是否想編輯文件 read -p "Do you want to editing file '$TARGET_FILE' (y/n)?" if [ "$REPLY"='y' -O "$REPLY" = 'Y' -o "$REPLY"="Yes" ] then echoecho "Opening file '$TARGET_FILE' using ${EDITOR:-vim}..."sleep 3#使用編輯器打開文件,如果變量EDITOR 為空使用vim${EDITOR:-vim} "$TARGET_FILE"echo "Thank you for editing the file." fi echo #詢問用戶是否想查看文件內容 read -p "Do you want to see the file just edited (y/n)?" if [ "$REPLY" = 'y' -o "$REPLY"='Y' -o "$REPLY"="Yes" ] then echoecho "Opening the file using '${PAGER:-less}'..."sleep 3#顯示文件內容,如果變量PAGER為空就使用less${PAGER:-less} "$TARGET_FILE" fi echo echo "Bye!" echo else echo echo "File $TARGET_FILE can not be accessed,Please specify a Readable and Writable file." echo echo "Bye!" echo exit 1fi exit 0
腳本有點復雜
通過通配符來實現文件名替換,如?,*,[a-b],[^ab],[!ab]。
案例:
#!/bin/bash#臨時目錄TMPDIR=globbing#創建臨時目錄mkdir $TMPDIRcd $TMPDIR#創建一些文件來顯示通配符匹配touch a.txt b.txt c.txtcount=1while [ "$count" -le 4 ]do touch "tmpfile.$count" let count+=1 echo "$count"doneecho#使用通配符顯示文件echo "OUTPUT from ls *:"ls *echoecho "OUTPUT from ls ?.txt"#顯示文件名以txt結束的文件ls ?.txtechoecho "OUTPUT from ls [ab]*"#顯示文件名以字母a或b起始的文件ls [ab]*echo echo "OUTPUT from ls [^ab]*"#顯示文件名不以字母a或b起始的文件ls [^ab]*echo echo "OUTPUT from ls [!ab]*"#顯示文件名不以字母a或b起始的文件ls [!ab]*echo echo "OUTPUT from tmpfile.[a-c]"#顯示文件名以字母a或b或c起始的文件ls [a-c]*echo echo "OUTPUT from tmpfile.[1-4]"#顯示文件名以數字1或2或3或4結尾的文件ls tmpfile.[1-4]#返回之前的目錄cd ->/dev/null #清除臨時目錄echoecho "Clean up tmp dir"rm -rf $TMPDIRexit 0
shell支持如下幾種通配符:
wildcard | Description |
* | 匹配0或多個任意的字符 |
? | 匹配一個任意字符 |
[] | 匹配指定字符范圍的任意一個字符 |
注意:
1 通配符*不會匹配隱藏的文件。
2~/[.]bashrc和~/?bashrc及~/*bashrc都不能擴展為主目錄下的.bashrc文件,此時需要明確地寫出第一個字符是點。
命令替換:當一個命令中引用另一個命令的輸出時,就會用到命令替換。
命令替換的格式:
$(commands) 推薦使用,可讀性和嵌套性更好
或
`commands`
通過算術運算可以計算一些算術表達式,并用計算得到的結果替換原來的表達式。
算術運算替換的格式:
$((exPRession))
注意:
1 $(())只能進行整數運算,結果中的小數部分都會忽略。
2 let命令的算術表達式不能包含任何空格。
新聞熱點
疑難解答