通过此文记下用到过的或者看到过的shell脚本小模板,持续更新…
注意事项(个人规范)
- 引用变量使用
${var}
的方式,字符串用双引号,比如包含换行符的字符串变量必须用echo "${str}"
的形式,否则echo ${str}
会忽略换行符 - 命令执行结果赋值给变量个人偏好使用反引号,需要嵌套时才用
$()
1. 判断字符串是否包含子串
#! /bin/sh
# 用 =~ 判断是否包含子串
# 定义变量等号两边不能有空格
source_string="How are you, I'm fine, thanks"
target_string="thanks"
# 必须用双中括号,且中括号两边都要有空格
if [[ "${source_string}" =~ "${target_string}" ]]; then
echo "yes"
else
echo "no"
fi
2. 使用awk分割字符串
#! /bin/sh
# 使用awk分割字符串
java_path="/usr/local/agent/jdk1.8.0_192/jre/java"
# 获取jdk相对路径 输出jdk1.8.0_192
jdk_relative_path=`echo "${java_path}" | awk -F "/" '{print $5}'`
#获取jdk绝对路径,即JAVA_HOME, /usr/local/agent/jdk1.8.0_192
jdk_absolute_path=`echo "${java_path}" | awk -F "/" '{print $1 "/" $2 "/" $3 "/" $4 "/" $5}'`
3. 获取脚本当前所在的绝对路径
#! /bin/sh
# 输入/usr/local/a.txt,dirname命令输出/usr/local. 输入a.txt,dirname输出 .
# 因此dirname命令得到的不一定是绝对路径,结合cd和pwd可获取绝对路径
# 命令执行结果赋值给变量有两种方式,反引号和$(),反引号不可嵌套,$()可以嵌套
current_absolute_path=$(cd "$(dirname "$0")";pwd)
4. 日志打印函数
function print_msg() {
# +号左边有空格,右边没空格
time_info=`date +"%Y-%m-%d %H:%M:%S"`
echo "${time_info} $1"
}
5. usage函数
function usage() {
echo "Usage: $0 [options]"
echo " --a a is ..."
echo " --b b is ..."
echo " --z z is ..."
echo ""
}