获取一些常用变量:
# 获取当前脚本所在目录
SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
# 获取当前脚本的文件名
SCRIPT_NAME=$( basename "$0" )
# 在 $DIR 中搜索第一个 jar 文件的名字
JAR_FILE=$(find $DIR -maxdepth 1 -type f -name "*.jar" | head -1)
# 格式化当前日期时间。其他格式化占位符:
# %a=Mon,%A=Monday,%b=Jan,%B=January,%I%p=03pm,%s=epoc秒,%z=zone
current_time=$(date +"%Y-%m-%d %H:%M:%S")
一些常用的判断:
# 判断变量是否为空
if [ -z "$VAR" ]; then
echo "\$VAR is empty"
else
echo "\$VAR is $VAR"
fi
# 判断路径是否存在
# -d 表示目录,-f 表示文件
if [ -d "$PATH" ]; then
echo "File $PATH exists"
else
echo "File $PATH not found"
fi
# 判断当前用户是否是 root
if [ "${EUID:-$(id -u)}" -eq 0 ]; then
do_root_stuff
fi
# 判断 docker 命令能否执行
if ! command -v docker &> /dev/null; then
echo "当前系统不能运行 docker 命令"
fi
常用判断的简写
# 为变量 BRANCH 赋值为参数 $1,如果参数不存在则取默认值 "dev"
[ -n "$1" ] && BRANCH=$1 || BRANCH="dev"
根据进程启动命令中的关键字搜索进程ID
# set pid=$(get_pid "some-service-name")
get_pid() {
SERVICE_NAME=$1
PID=$(ps aux | grep "[${SERVICE_NAME:0:1}]${SERVICE_NAME:1}" | awk '{print $2}')
echo "$PID"
}
解析并查询命令行参数的通用方法
这段脚本非常有用,你只要在你的脚本开头加上下面的内容,就能以 --param value
的格式解析参数。由于这段脚本尽可能写的短小不占空间,所以格式方面会要求所有的参数都有值,例如不接受无参数的 --daemon
,而必须传 --daemon true
。
### 解析命令行参数
PARAMS_ARR=()
while (( "$#" )); do
case "$1" in --*) PARAMS_ARR+=($1); shift;; *) PARAMS_ARR[${#PARAMS_ARR[@]}-1]="${PARAMS_ARR[${#PARAMS_ARR[@]}-1]} $1"; shift;; esac
done
### 获取命令行参数,如果没有则返回默认值
### 示例:value=$(get_param "param_name" "default_value")
function get_param {
for param in "${PARAMS_ARR[@]}"; do if [[ $param =~ "--$1" ]]; then echo ${param#"--$1"} && return 0; fi done
echo $2
}
### 获取命令行参数,如果没有则报错退出(退出机制需要 set -e 来开启,否则你就要自行处理返回值)
### 示例:value=$(get_param_required "param_name")
function get_param_required {
for param in "${PARAMS_ARR[@]}"; do if [[ $param =~ "--$1" ]]; then echo ${param#"--$1"} && return 0; fi done
echo -e "\e[31mParameter '$1' is required\e[m" >&2 && return 1
}
set -e
从上面的脚本中解析参数值为数组
如果参数值为多个,则可以用下面的语句提取成数组:
# 假设要提取名为 PARAM_NAME 的参数值赋给数组 ARR,可以用下面一行
IFS=', ' read -r -a ARR <<< $(get_param PARAM_NAME)
# 这里多个参数值可以用逗号或空格隔开,例如 "--values a,b, c d",
# 解析出来的数组元素不会包含空白字符
# 检查解析结果
echo "ARR size: ${#ARR[@]}"
echo "ARR content: ${ARR[@]}"
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。