Shell编程学习笔记

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 为真,其他为假
逻辑与: &&
第一个条件为假时,第二条件不用再判断,最终结果已经有;
第一个条件为真时,第二条件必须得判断;
逻辑或: ||
逻辑非: !
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值