案例
案例1概述
#!/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。 | 
if 函数
Shell 流程控制 | 菜鸟教程 (runoob.com)
格式一:
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi格式二:
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi:= 功能: 设置默认值
属于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 的 function
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 "输入的两个数字之和为 $? !" 
案例2概述
#!/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的传参方式
Shell 传递参数 | 菜鸟教程 (runoob.com)
| 参数处理 | 说明 | 
|---|---|
| $# | 传递到脚本或函数的参数个数 | 
| $* | 以一个单字符串显示所有向脚本传递的参数 | 
| $$ | 脚本运行的当前进程ID号 | 
| $! | 后台运行的最后一个进程的ID号 | 
| $@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 | 
| $- | 显示Shell使用的当前选项,与set命令功能相同。 | 
| $? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 | 
案例3概述
#!/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
chmod
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 远程服务器执行命令
# ssh 用户@IP地址 "执行的命令"
ssh ${server_name}@${server_address} "if [ ! -d ${output_path} ];then mkdir -p ${output_path}; fi"cp
参数
- -r或- --recursive:用于复制目录及其所有的子目录和文件,如果要复制目录,需要使用该选项。
- -i或- --interactive:在复制前提示确认,如果目标文件已存在,则会询问是否覆盖,回答 y 时目标文件将被覆盖。。
- -u或- --update:仅复制源文件中更新时间较新的文件。
- -v或- --verbose:显示详细的复制过程。
- -p或- --preserve:保留源文件的权限、所有者和时间戳信息。
- -f或- --force:强制复制,即使目标文件已存在也会覆盖,而且不给出提示。
- -l:不复制文件,只是生成链接文件。
案例4概述
#!/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 + done < test.txt
while read line
do
    echo $line
done < count.txt
date
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" 
awk -F
 -F fs or --field-separator fs
 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:
Linux awk 命令 | 菜鸟教程 (runoob.com)
grep -c
- -c:只打印匹配的行数。
- -i:忽略大小写进行匹配。
- -v:反向查找,只打印不匹配的行。
- -n:显示匹配行的行号。
- -r:递归查找子目录中的文件。
- -l:只打印匹配的文件名。
Linux grep 命令 | 菜鸟教程
for 循环逐行读取文件
for line in `cat count.txt`; do echo $line; done 
重定向
2>&1
Shell 重定向 2>&1 含义说明




















![[架构之路-251/创业之路-82]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 商业智能、决策支持系统、知识管理](https://img-blog.csdnimg.cn/5ea1150dabd8486295b0dd77167ed22e.png)