set -e和set -x含义
set -e
# 在shell脚本开头加上set -e,这句话告诉bash 如果任何语句的执行结果不是true, 就直接退出shell脚本
#################示例1###########################
#!/bin/bash
set -e #"Exit immediately if a simple command exits with a non-zero status."
touch a.txt
echo "touch a.txt done"
i #这里有个错误,马上终止脚本
set -x
#set -x会在执行每一行 shell 脚本时,把执行的内容输出来。它可以让你看到当前执行的情况,里面涉及的变量也会被替换成实际的值。
#默认脚本执行情况下,屏幕只显示运行结果,没有其他内容,如果多个命令连续执行,运行结果就会连续输出,分不清楚哪行命令的执行,与结果
#set -x 用来在显示运行结果之前,先输出执行的那条命令
#############示例##############
[root@jenkins01 backup]# sh test.sh
+ set -e
+ touch a.txt
+ echo 'touch a.txt done'
touch a.txt done
+ touch b.txt
+ echo 'touch b.txt done'
touch b.txt done
+ touch c.txt
+ echo 'touch c.txt done'
touch c.txt done
Shell中的$0、$1、$2的含义
比如你新建了一个shell脚本 Test.sh, 内容如下:
#!/bin/sh
echo "shell脚本本身的名字: $0"
echo "传给shell的第一个参数: $1"
echo "传给shell的第二个参数: $2"
保存退出后,你在Test.sh所在的目录下输入 bash Test.sh 1 2
结果为:
shell脚本本身的名字: Test.sh
传给shell的第一个参数: 1
传给shell的第二个参数: 2
shell 脚本中$ 、 、 、#、$?、$1等分别代表什么意思?
$0 当前脚本的执行名字
$n 当前脚本执行命令的第n个参数值,n = 1…9
$* 当前脚本执行命令的所有参数,此选项参数可超过9个
$# 当前脚本执行命令的输入参数个数,例如执行 ./test.sh aa bb cc ,则在 test.sh 里 $# 为 3
$$ 当前shell的PID(即获取脚本运行的当前进程号)
$! 上一个执行指令的PID(后台运行的最后一个进程的进程ID号)
$- 显示shell使用的当前选项,与set命令功能相同
@
跟
@ 跟
@跟*类似,但是可以当作数组用
$? 获取执行上一个指令的执行状态返回值(0为成功,非零为失败),这个变量最常用,如下所示
# 结果输出上一条命令 grep 命令的返回值
grep xxx a.txt
echo $?
# 判断打开目录命令是否成功,不成功则输出提醒信息并退出
dir_exe=../cron
cd $dir_exe
if [ $? -ne 0 ]; then
echo "cannot change dir to $dir_exe"
exit 1
fi
exit 0的含义
exit(0):正常运行程序并退出程序;
exit(1):非正常运行导致退出程序;
return():返回函数,若在主函数中,则会退出函数并返回一值。
shell脚本[ ] [[ ]] -n -z 的含义解析
[ -z STRING ] “STRING” 的长度为零则为真。 字符串为空即NULL时为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。加-n与不加-n结果相同。
! 代表非
if基本语法结构
if [ command ]; then
符合该条件执行的语句
fi
if [ ! -n ]
if [ ! -n "${VERSION}" ]; then
##### ! -n "${VERSION}"####代表${VERSION}这个变量长度是0,则 exit0,如果
echo "Harbor 仓库 '${FULL_IMAGE_PATH}' 存在异常,本次更新版本失败,请确认 Harbor 仓库镜像正常后重新构建!"
exit 0
fi
if [[ -z “${running}” ]]
if [[ -z "${running}" ]]; then
echo "本次为该节点首次运行,没有在运行中的容器,准备开始拉取镜像。"
else
runningversion=${running##*:}
echo "当前运行容器的版本:${runningversion}"
# 停止并删除目前运行的容器
docker stop $(docker ps -a | grep ${IMAGE_NAME} | awk '{print $1}')
docker rm -f $(docker ps -a | grep ${IMAGE_NAME} | awk '{print $1}')
fi
if [[ ! -z "${currentimageid}" ]]; then
echo "删除当前镜像:${currentimageid}"
docker rmi -f $(docker images -a | grep ${IMAGE_NAME} | awk '{print $3}')
fi
shell中#,##,#,##,% *,%% *的含义及用法
假设定义了一个变量为:
代码如下:
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
普通变量定义,单引号’ '双引号 " "的用法区别
变量名=value #适用于数字
变量名='value' #写入什么,输出就是什么,适用于字符串
变量名="value" #用的最多,一般都选这个方法
[root@jenkins01 backup]# a=192.168.1.1-$a
[root@jenkins01 backup]# b='192.168.1.1-$b'
[root@jenkins01 backup]# c="192.168.1.1-$c"
[root@jenkins01 backup]# echo "a=$a"
a=192.168.1.1-192.168.1.1
[root@jenkins01 backup]# echo "b=$b"
b=192.168.1.1-$b
[root@jenkins01 backup]# echo "c=$c"
c=192.168.1.1-192.168.1.1
[root@jenkins01 backup]# echo "c=${c}"
c=192.168.1.1-192.168.1.1
[root@jenkins01 backup]# c="192.168.1.1-$a"
[root@jenkins01 backup]# echo "c=${c}"
c=192.168.1.1-192.168.1.1-192.168.1.1
[root@jenkins01 backup]#
把一个命令的结果作为变量的内容赋值的方法
变量名=`ls`
变量名=$(ls) #推荐这种方法
shell 中 [-eq] [-ne] [-gt] [-lt] [ge] [le] 用法
-eq //等于
-ne //不等于
-gt //大于 (greater )
-lt //小于 (less)
-ge //大于等于
-le //小于等于
命令的逻辑关系:
在linux 中 命令执行状态:0 为真,其他为假
逻辑与: &&
第一个条件为假时,第二条件不用再判断,最终结果已经有;
第一个条件为真时,第二条件必须得判断;
逻辑或: ||
逻辑非: !