案例
案例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 含义说明