歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux系統學習筆記:BASH編程

Linux系統學習筆記:BASH編程

日期:2017/3/1 15:27:49   编辑:關於Linux
Linux系統學習筆記:BASH編程 使用 var=(element element ...) 創建數組變量。引用數組中的元素時使用 ${var[i]} , i 為下標,下標@ 復制原數組,下標 * 也復制原數組,但加雙引號時它將原數組作為一個元素。給數組中單個元素賦值時可以用 var[i]=value 。 ${#var[i]} 返回元素的長度, ${#var[*]} 返回數組中元素的個數。 $ array=(Alex Harry Nancy) $ arr1=("${array[@]}") $ arr2=("${array[*]}") $ declare -a declare -a arr1='([0]="Alex" [1]="Harry" [2]="Nancy")' declare -a arr2='([0]="Alex Harry Nancy")' declare -a array='([0]="Alex" [1]="Harry" [2]="Nancy")' $ array[1]=Jerry $ echo ${array[*]} Alex Jerry Nancy $ echo ${array[@]} Alex Jerry Nancy $ echo ${#array[*]} ${#array[1]} 3 5 變量的作用域為當前腳本,可以用 export 聲明變量,它將父進程的變量變為對子進程是可用的。函數中的變量默認不是局部的,作用域也為當前腳本,為了避免沖突,可以用 typeset 將它聲明為局部變量。 ${#var} 返回變量的長度。 ${var:-default} 使用變量的值,如果值為空或未賦值,則使用給出的默認值。 ${var:=default} 和前者類似,但它同時會在值為空或未賦值時將默認值賦給變量。 ${var:?message} 可以在值為空或未賦值時顯示錯誤信息,如果未給出 message ,則顯示默認錯誤信息。 $ cd ${dir:?$(date +%T) error, dir not set.} -bash: dir: 10:15:29 error, dir not set. : 可以給其後的變量賦值但不去執行它,常常用 : ${var:=default} 來給變量設置默認值。 BASH中有一種字符串模式匹配,形式為 ${varOPpattern} , OP 為: # 去除最小匹配前綴, ## 去除最大匹配前綴, % 去除最小匹配後綴, %% 去除最大匹配後綴。 $ file=/home/yeolar/a.sh $ echo ${file##/*/} a.sh $ echo ${file%/*} /home/yeolar ((var=base#n)) 語法可以給變量以其他基數賦值。 $ ((n=8#0101)); echo $n 65 位置參數 位置參數保存命令和命令後的參數。可以用 set 改變位置參數的內容,但不能在腳本內改變命令名。 $# 保存參數的個數, $0 保存命令名, $1 - $n 保存命令後的參數, $@ 和 $* 保存全部參數,和數組變量類似,加雙引號時 $* 作為一個參數,而 $@ 作為一組參數。 shift 左移參數。 set 初始化參數( set 沒有參數時顯示已設置的shell變量,還可以用它來設置shell特性)。 $ cat a.sh echo "cmd: $0, args: $*, argnum: $#" echo "first arg: $1" echo "shift args..." shift echo "cmd: $0, args: $*, argnum: $#" echo "first arg: $1" set "$@" echo "first arg: $1" set "$*" echo "first arg: $1" set a b c echo $* $ bash a.sh x y z cmd: a.sh, args: x y z, argnum: 3 first arg: x shift args... cmd: a.sh, args: y z, argnum: 2 first arg: y first arg: y first arg: y z a b c 還有一些特殊參數: $$ 保存當前(shell)進程的PID, $! 保存最近轉入後台運行的進程的PID, $? 保存上一個命令的返回狀態碼。 特殊參數和位置參數不能通過賦值語句改變。 表達式 可以用 let "expr" 或 ((expr)) 對算術表達式求值,多個表達式可以分別用空格和逗號分開。 $ x=1 y=1 z=0 $ let "x = x * 10 + y" z=z+1 $ echo $x $y $z 11 1 1 $ ((x = x * 10 + y, z = z + 1)) $ echo $x $y $z 111 1 2 條件表達式用 [[expr]] 求值。有個比較特別的運算符是 = ,在條件表達式中可以用它來判斷相等。 運算符 BASH支持絕大部分C語言的運算符,有些運算符增加了一些特定語法結構中的含義,如管道。 控制流 if...then if...then 的語法如下: if test-command then command [elif test-command then command ...] [else command] fi 為了減少縮進,常常用 ; 將 then 寫到上一行。 test-command 為測試命令,可以用 test 命令進行測試,但一般使用它的同義詞 [] 。 # 檢查參數個數 if [ $# -eq 0 ]; then # 等價於:if test $# -eq 0; then echo "Usage: cmd arg" 1>&2 exit 1 fi 對於數值的測試,可以使用: -eq 等於 -ne 不等於 -gt 大於 -ge 大於等於 -lt 小於 -le 小於等於 字符串的比較可以使用 = 和 != 。 下面是一些和文件相關的檢查選項: -e 檢查文件是否存在 -d 檢查文件是否存在且是目錄 -f 檢查文件是否存在且是普通文件 -s 檢查文件是否存在且大於0字節 -r 檢查文件是否存在且可讀 -w 檢查文件是否存在且可寫 -x 檢查文件是否存在且可執行 for for 的語法如下: for var[ in list] do command done seq 為可展開為列表的表達式。可以省略 in list ,這時列表為命令的參數,即 $@ 。 # whos腳本,打印用戶名和全名 Usage: whos user ... for user; do gawk -F: '{print $1, $5}' /etc/passwd | grep -i "$user" done while和until while 和 until 類似,區別是 until 在 do 分支執行後測試,並且是測試結果為假時循環,測試結果為真時跳出循環。 語法為: while test-command do command done until test-command do command done # 查找拼寫錯誤的詞 while read line; do if ! grep "^$line$" "$1" > /dev/null; then echo $line fi done # 猜名字 rightname=yeolar until [ "$name" = "$rightname" ]; do echo -n "Guess: " read name done echo "Good, you've got it." break和continue break 和 continue 可以用於在 for 、 while 和 until 語句中跳出循環和繼續下一循環。 case case 用於多路選擇。語法為: case test-command in pattern) command ;; [pattern) command ;; ...] esac pattern 可以使用 * 匹配任意字符串, ? 匹配單個字符, [...] 給出可匹配的字符, | 分離不同的選擇。 # 命令選擇 echo -e "\ncmds: A for date, B for who, C for pwd.\n" echo -n "Enter A, B or C: " read c case "$c" in a|A) date ;; b|B) who ;; c|C) pwd ;; *) echo "Invalid choice: $c" ;; esac select select 顯示一個菜單,根據用戶的選擇給變量賦予相應的值,然後執行命令。退出 select 可以使用 break,或者 exit 退出整個腳本。 select var[ in list] do command done 和 for 一樣,省略 in list 會用命令參數代替。 PS3 設置 select 的提示符,一般會設置為需要的提示語句。 # 命令菜單 PS3="Choose what you want to do: " select c in date who pwd exit; do if [ "$c" == "" ]; then echo -e "Invalid choice.\n" continue elif [ $c = exit ]; then echo "quit" break fi echo "You choose: $c" if [ $c = date ]; then date elif [ $c = who ]; then who elif [ $c = pwd ]; then pwd fi echo "" done 文件描述符 在BASH中,使用 exec 命令執行文件描述符相關的操作: exec n> outfile 打開outfile作為輸出文件,分配文件描述符n exec n< infile 打開infile作為輸入文件,分配文件描述符n exec n<&m 打開或重定向文件描述符n,作為文件描述符m的副本 exec n<&- 關閉文件描述符n 內置命令 前面已經提到了很多BASH內置命令,這裡做個總結和補充。 : 返回0或 true (置空內部命令) . 把shell腳本當作當前進程的一部分執行 bg 掛起任務 break 跳出循環 cd 改變工作目錄 continue 繼續下一循環 echo 顯示 eval 掃描並計算命令行 exec 執行shell腳本或程序並替換掉當前進程 exit 從當前shell退出 export 將變量放到被調用的環境中 fg 將後台任務移到前台 getopts 分析讀取shell腳本的參數 jobs 列出後台任務 kill 向進程或作業發送信號 pwd 顯示當前工作目錄 read 從標准輸入中讀一行 readonly 聲明變量為只讀 set 列出全部變量,設置shell特性,設置命令行參數 shift 左移命令行參數 test 比較 times 顯示當前shell及其子進程的運行時間 trap 捕獲信號 type 顯示參數給出的命令的相關信息 umask 返回文件創建的掩碼,設置掩碼 unset 刪除變量或函數 wait 等待後台進程結束 read 支持一些選項: -a array 輸入的單詞作為 array 的元素 -d delim 使用 delim 代替換行來終止輸入 -e 使用Readline庫來獲取輸入(輸入來自鍵盤時) -n num 讀取 num 個字符後返回 -p prompt 以 prompt 作為輸入的提示信息 -s 在終端上不打印字符 -un 從文件描述符為n的文件輸入 有個特殊的變量 REPLY ,保存讀取的輸入。 getopts 的語法為 getopts optstr var[ arg ...] , optstr 給出合法的字母選項, var 保存每次接收的選項的值, arg 為將處理的參數,省略將默認處理命令行參數。 optstr 以 : 開始時由腳本負責產生錯誤信息,否則由 getopts 自己產生。 optstr 用字母後的 : 表示選項接受值, OPTARG 保存和選項相關的值。OPTIND 保存選項的索引,起始值為1。 exec 既可執行腳本又可執行程序,它不創建新進程,把當前(shell)進程替換為要執行的內容。 trap 的用法是 trap ['command'] [signal] ,它捕獲信號,執行 command ,如果沒有 command ,那麼重置trap 。 trap '' 2 15 # 捕獲並忽略中斷 trap 'echo Interrupted.; exit 1' INT # 捕獲中斷,打印信息並退出 kill 給進程發送信號,如終止進程。後面會詳細講有關進程的內容。 shell腳本 根據本篇介紹的內容和前兩篇的一些知識就可以編寫shell腳本了。 像Python腳本一樣可以用 #! 為腳本定義解釋器。 #!/bin/bash # 或者: #!/usr/bin/env bash
Copyright © Linux教程網 All Rights Reserved