标准化模板规范:
#!/usr/bin/env bash
######################################################
## Program Name:
## Description:
## Author:
## Creation Date:
######################################################
# Modification History
######################################################
# Date Modified Task Description
# ====================================================
# 20231107 someone 1 module
echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] check the variable is ready or not"
var1=$1
var2=$2
var3=$3
if [ $# -ne 3 ];then
echo "`date '+%Y-%m-%d %H:%M:%S'`:[ERROR] check the variable is not ready"
echo "var1=$1 var2=$2 var3= $3"
exit 1
else
echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] check the variable is ready"
fi
echoVar(){
echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] exec the function echoVar"
echo $var1
echo $var2
echo $var3
echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] function echoVar finished"
}
echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] output default ENV"
WORKSPACE=`pwd`
echo "WORKSPACE = $WORKSPACE"
echo "count.txt = `ls -l $WORKSPACE | grep 'count.txt'`"
echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] read line"
if [[ ! -e $WORKSPACE/count.txt && ! -s $WORKSPACE/count.txt ]];then
echo "`date '+%Y-%m-%d %H:%M:%S'`:[ERROR] count.txt is not ready"
exit 1
else
echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] count.txt is ready, output the line"
while read line
do
echo $line
done < count.txt
fi
echoVar
#!/usr/bin/env bash
######################################################
## Program Name:
## Description:
## Author:
## Creation Date:
######################################################
# Modification History
######################################################
# Date Modified Task Description
# ====================================================
# 20231107 someone 1 module
#!/bin/bash
if [ -z "${NEXUS_ID}" ] || [ -z "${NEXUS_VERSION}" ]; then
echo "the length of NEXUS_ID or NEXUS_VERSION is zero"
echo "NEXUS_ID: ${NEXUS_ID}"
echo "NEXUS_VERSION: ${NEXUS_VERSION}"
exit 3
fi
if [ -z "${NEXUS_USERNAME}" ] || [ -z "${NEXUS_PASSWORD}" ]; then
echo "the length of NEXUS_USERNAME or NEXUS_PASSWORD is zero"
echo "NEXUS_USERNAME: ${NEXUS_USERNAME}"
echo "NEXUS_PASSWORD: ${NEXUS_PASSWORD}"
exit 3
fi
NEXUS_URL=${NEXUS_URL:="https://nexus.com:8080"}
function GET_RELEASE_VERSION() {
NEXUS_RELEASE_URL=$1
set +x
wget --user=${NEXUS_USERNAME} --password=${NEXUS_PASSWORD} ${NEXUS_RELEASE_URL}
set -x
}
function main() {
GET_RELEASE_VERSION
}
main
Shell 基本运算符 | 菜鸟教程 (runoob.com)
假定变量 a 为 "abc",变量 b 为 "efg":
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n "$a" ] 返回 true。 |
$ | 检测字符串是否不为空,不为空返回 true。 | [ $a ] 返回 true。 |
假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
假定变量 a 为 10,变量 b 为 20
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
文件测试运算符用于检测 Unix 文件的各种属性。
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
Shell 流程控制 | 菜鸟教程 (runoob.com)
格式一:
if condition
then
command1
command2
...
commandN
else
command
fi
格式二:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
if 用来筛选文件夹
for file in `ls -a`
do
if [[ $file != '.' && $file != '..' ]]
then
echo $file
else
echo "special ========= $file"
fi
done
属于shell 变量操作:根据状态为变量赋值
shell变量操作${}详细用法 - 云翼1213 - 博客园 (cnblogs.com)
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
属于shell 变量操作:根据状态为变量赋值
Shell 函数 | 菜鸟教程 (runoob.com)
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
#!/bin/bash
Dir=$1
backup="${Dir}/backup"
echo "backup: $backup"
[ ! -d ${bakup_dir} ] && mkdir -p ${backup}/${month}
echo "$backup/$month"
rm -rf ${backup}/${month}
Shell 传递参数 | 菜鸟教程 (runoob.com)
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
#!/bin/bash
server_address=$1
server_name=$2
output_path=$3
user=$4
# ossutil installed or not? not ==> installed
which ossutil
if [ $? -ne 0 ];then
echo "ossutil install"
mkdir -p /home/$user/.local/bin
cp -rf ./ossutil /home/$user/.local/bin
chmod 0755 /home/$user/.local/bin/ossutil
fi
# create output folder
timeout 30s ssh ${server_name}@${server_address} "if [ ! -d ${output_path} ];then mkdir -p ${output_path}; fi"
# echo success
Linux chmod 命令 | 菜鸟教程 (runoob.com)
假定变量 a 为 10,变量 b 为 20
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
# ssh 用户@IP地址 "执行的命令"
ssh ${server_name}@${server_address} "if [ ! -d ${output_path} ];then mkdir -p ${output_path}; fi"
参数
-r
或 --recursive
:用于复制目录及其所有的子目录和文件,如果要复制目录,需要使用该选项。-i
或 --interactive
:在复制前提示确认,如果目标文件已存在,则会询问是否覆盖,回答 y 时目标文件将被覆盖。。-u
或 --update
:仅复制源文件中更新时间较新的文件。-v
或 --verbose
:显示详细的复制过程。-p
或 --preserve
:保留源文件的权限、所有者和时间戳信息。-f
或 --force
:强制复制,即使目标文件已存在也会覆盖,而且不给出提示。#!/bin/bash
set -x
echo `date "+%Y-%m-%d %H:%M:%S"`
for num in {1..10};
do
echo "number: ${num}"
done
echo `date -d "30 minute age" + %s`
while read line
do
echo $line
done < count.txt
date '+%Y-%m-%d %H:%M:%s'
date +%Y%m
date +%Y%m%d
bath_date=${4:-$(date +%Y%m%d)}
echo "`date '+%Y-%m-%d %H:%M:%s'`:[INFO] SOMETHING INFOS"
date -d "2 year ago" +"%Y%m%d%H%M%S"
用于设置或显示环境变量。
在 shell 中执行程序时,shell 会提供一组环境变量。export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。
Linux export命令 | 菜鸟教程 (runoob.com)
-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:
Linux awk 命令 | 菜鸟教程 (runoob.com)
-c
:只打印匹配的行数。-i
:忽略大小写进行匹配。-v
:反向查找,只打印不匹配的行。-n
:显示匹配行的行号。-r
:递归查找子目录中的文件。-l
:只打印匹配的文件名。Linux grep 命令 | 菜鸟教程
Linux sed 命令 | 菜鸟教程 (runoob.com)
Linux set命令 | 菜鸟教程 (runoob.com)
for line in `cat count.txt`; do echo $line; done
Shell 重定向 2>&1 含义说明