#!/bin/bash # FILENAME:filelock # 默認重試次數 retries="10" # 默認操作 action="lock" # 用於鎖文件的空命令 nullcmd="'which true'" # 設置選項 while getopts "lur:" opt; do case $opt in l) action="lock" ;; u) action="unlock" ;; r) action="$OPTARG" ;; esac done shift $(($OPTIND - 1)) # $OPTIND 是參數指針(選項索引) if [ $# -eq 0 ]; then cat<<EOF >&2 Usage: $0 [-l|-u] [-r retries] LOCKFILE Where -l requests a lock (the default), -u requests an unlock, -r X specifies a max number of retries before it fails (default = $retries). EOF exit 1 fi # 確定是否有lockfile命令 if [ -z "$(which lockfile | grep -v '^no ')" ]; then echo "$0 failed: `lockfile` utility not found in PATH." >&2 exit 1 fi if [ "$action" = "lock" ]; then if ! lockfile -1 -r $retries "$1" 2>/dev/null; then echo "$0: Failed: Couldn't create lockfile in time." >&2 exit 1 fi else if [ ! -f "$1" ]; then echo "$0: Warning: lockfile $1 doesn't exist to unlock." >&2 exit 1 fi rm -f "$1" fi exit 0
備註:
1、此腳本需要保證系統中預裝了lockfile,可通過 "man 1 lockfile" 來確認,看到了相應的手冊頁就說明安裝了 2、OPTARG:表示當前選項的參數 3、OPTIND:表示下一個選項在【參數列表】中的位置 參數列表的初始值爲1(即從$1開始) 處理帶參數的選項,值加2; 處理不帶參數的選項或非法選項,值加1 在case匹配開始的時候就已經增加,指向了下一個選項的位置 shift $(($OPTIND-2)) 讓當前選項(正在處理的選項)處於 $1 位置 shift $(($OPTIND-1)) 讓下一個選項(未處理的選項)處於 $1 位置