之前寫測試程式使用指令碼引發了興趣,結合具體案例,檢驗學習成果。終於看懂了一個稍微複雜的shell指令碼。裡面還是有很多技巧性的東西存在。
聲明的變數名,BLUETOOTH_SLEEP_PATH沒有用到 [html] view plain copy BLUETOOTH_SLEEP_PATH=/proc/bluetooth/sleep/proto LOG_TAG="qcom-bluetooth" LOG_NAME="${0}:"
聲明函數
$# ----傳遞給程式的總的參數數目
$? ----上一個代碼或者shell程式在shell中退出的情況,如果正常退出則返回0,反之為非0值。
$* ----傳遞給程式的所有參數組成的字串。
$- ----在Shell啟動或使用set命令時提供選項
$? ----上一條命令執行後返回的值
$$ ----當前shell的進程號
$! ----上一個子進程的進程號
$@ ----所有的參數,每個都用雙括弧括起
$n ----位置參數值,n表示位置
$0 ----當前shell名 [html] view plain copy loge () { /system/bin/log -t $LOG_TAG -p e "$LOG_NAME $@" } logi () { /system/bin/log -t $LOG_TAG -p i "$LOG_NAME $@" } failed () { loge "$1: exit code $2" exit $2 }
&符號我理解是後台啟動並執行意思,這樣$!表示上一個子進程的進程號,用法可參考test2.sh [html] view plain copy start_hciattach () { /system/bin/hciattach -n $BTS_DEVICE $BTS_TYPE $BTS_BAUD & hciattach_pid=$! logi "start_hciattach: pid = $hciattach_pid" echo 1 > $BLUETOOTH_SLEEP_PATH } kill_hciattach () { echo 0 > $BLUETOOTH_SLEEP_PATH logi "kill_hciattach: pid = $hciattach_pid" ## careful not to kill zero or null! kill -TERM $hciattach_pid # this shell doesn't exit now -- wait returns for normal exit }
擷取參數並解析,跟c語言中的類似。blnp是不帶參數的,t:s:帶一個冒號表示帶參數、
預設輸出USAGE [html] view plain copy while getopts "blnpt:s:" f do case $f in b | l | n | p) opt_flags="$opt_flags -$f" ;; t) timeout=$OPTARG;; s) initial_speed=$OPTARG;; \?) echo $USAGE; exit 1;; esac done shift $(($OPTIND-1))