010#文件鎖定

#!/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
View Code

備註:

1、此腳本需要保證系統中預裝了lockfile,可通過 "man 1 lockfile" 來確認,看到了相應的手冊頁就說明安裝了
2、OPTARG:表示當前選項的參數
3、OPTIND:表示下一個選項在【參數列表】中的位置
  參數列表的初始值爲1(即從$1開始)
  處理帶參數的選項,值加2;
  處理不帶參數的選項或非法選項,值加1
  在case匹配開始的時候就已經增加,指向了下一個選項的位置
  shift $(($OPTIND-2)) 讓當前選項(正在處理的選項)處於 $1 位置
  shift $(($OPTIND-1)) 讓下一個選項(未處理的選項)處於 $1 位置

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章