Bash 常用脚本片段

获取一些常用变量:

# 获取当前脚本所在目录
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)

一些常用的判断:

# 判断变量是否为空
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

根据进程启动命令中的关键字搜索进程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[@]}"

捏造的信仰
Java 开发人员

Java 开发人员

2.6k 声望
267 粉丝
0 条评论
推荐阅读
Spark 集群执行任务失败的故障处理
在 Spark Master 管理界面上看到任务的 Driver 地址不是真实 IP 地址,而是一个叫做“host.containers.internal”的主机名;

捏造的信仰阅读 664

免费1年服务器,部署个ChatGPT专属网页版
api.openai.com port 443: Connection timed out 你是不在调用 ChatGPT 接口的时候报错 443 了,哈哈哈,我的也是。当小傅哥发现自己开发的《ChatGPT AI 问答助手》已经不工作了,搜索了下为啥会 443 呢,原来是 ...

小傅哥3阅读 1.6k

封面图
蚂蚁安全科技 Nydus 镜像加速实践
蚂蚁安全科技 Nydus 镜像加速实践原创 曦栖 金融级分布式架构文|蚂蚁集团 ZOLOZ 团队使用全球领先安全科技,为用户和机构提供安全、便捷的安全风控解决方案。本文 6386 字 阅读 12 分钟背景简介ZOLOZ[1]是蚂蚁集...

SOFAStack1阅读 3.8k

封面图
git/pip/easy_install/apt代理/源设置
在公司内网环境中,访问公网往往需要经过公司的代理,对于浏览器、IDE等开发工具,都提供了设置代理的配置,而git、pip、easy_install等CLI工具,则需要通过命令或配置文件进行代理设置;对于Python、Ubuntu、Mav...

乘着风1阅读 5.5k

Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。

ThinkSNS1阅读 2.4k

confluence7.2.1的部署与迁移---呕心沥血版
Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。 到官网下载最新版本,截止目前...

暗涌阅读 7.8k

C++编译器和链接器的完全指南
C++是一种强类型语言,它的编译和链接是程序开发过程中不可或缺的两个环节。编译器和链接器是两个非常重要的概念。本文将详细介绍C++中的编译器和链接器以及它们的工作原理和使用方法。

小万哥2阅读 1k

封面图

Java 开发人员

2.6k 声望
267 粉丝
宣传栏