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 位置

 

posted @ 2020-05-29 22:31  bigtree2pingping  阅读(164)  评论(0编辑  收藏  举报