shell--检查github最新release
前言经常在需要使用脚本监控仓库是不是有最新的release版本的发布,然后进行自动构建。如何知道远程的github是发布新的release版本,可以能过脚本来获得。
git ls-remote作用:查看远程分支。能够列出远程分中的内容。
查看远程所有tag1git ls-remote --tags ./.
结果如下:
d6602ec5194c87b0fc87103ca4d67251c76f233a refs/tags/v0.99f25a265a342aed6041ab0cc484224d9ca54b6f41 refs/tags/v0.99.17ceca275d047c90c0c7d5afb13ab97efdf51bd6e refs/tags/v0.99.3c5db5456ae3b0873fc659c19fafdde22313cc441 refs/tags/v0.99.2
查看指定仓库分支1git ls-remote http://www.kernel.org/pub/scm/git/git.git master seen r ...
shell判空true false的一个坑
前言在写shell的时候发现一个违反直觉的的操作,一般判断一个变量是否为boolean,习惯上使用if param。但是在写脚本的时候,发现无论如何,不会走false。
反例在很多编程语言中,可以直接使用 if boolean,来判断这个变量是否为true。但是在shell当中直觉上是可以,但实际上是不能。
123456aaa=falseif [[ $aaa ]];then echo "is true"else echo "is false"fi
结是为is true,是不是违反直觉。
为什么这段脚本会进is true。
shell 是怎么执行这一段脚本的:
1sh -x test.sh
结果:
1234+ aaa=false+ [[ -n false ]]+ echo 'is true'is true
可以看到,如果是一个变量,shell 会默认加上-n来判断变量是否为空。aaa是有值的,而且在shell里,false 并不代表false。真正代表true和false的是0和1,没想到吧。
正常判断注意,这里用的是 ...
shell 数组
shell 也支持数组,就是写法跟平时的开发语言不太一样,反正我是觉得挺别扭。
声明数组数组数据使用一对括号( var )包起来,就能成为数组。
1234arr=(10 20 30 40)echo $arrecho $arr[1]echo $arr[2]
结果:
1020
打印数组打印数组的话要注意,直接打印数组,只会打印出第一条数数据,必须加上* 或 #,才能全部输出。
12345678910111213141516171819#!/bin/bash#数组取值days=(one two three 4)echo ${days}echo ${days[0]}echo ${days[1]}echo ${days[@]}echo ${days[*]}echo "**********"# 重置数组names=()names[1]=tomnames[2]=jackecho ${names}echo ${names[1]}echo ...
shell 实现进度条
实现拷大文件的时候,如果没有一个进度条,也不知道文件拷贝情况,所以搞一个进度条,时实查看进度。
12345678910#!/bin/bashmark=''for ((ratio=0;${ratio}<=100;ratio+=5))do sleep 0.2 printf "progress:[%-40s]%d%%\r" "${mark}" "${ratio}" mark="##${mark}"doneecho
shell 删除目录下备份目录数量
前言经常需要通过脚本来控制系统目录的里备份文件数量。不可能手动来经常查看,总是忘记。通过脚本定期自己查看目录里的文件数据,删除时间较早的目录。
实现那么就要设置几个条件:
允许存在几个目录
超过了怎么删除
怎么判断目录下有多少个目录?用ls就可以。
那多出来的怎么删除?遍历删,直到没有为止
完整代码如下:
1234567891011#!/bin/bashdirCount=5# 查看当前目录数currentDirCount=`ls -l | grep "^d" | wc -l`# 遍历删,直到没有为止while [ $currentDirCount -gt $dirCount ]do rm -rf `ls -1|head -n 1` currentDirCount=`ls -l | grep "^d" | wc -l`done
过滤目录,d 表示目录
grep "^d"
制造一些测试数据,然后执行上面的脚本验证。
1mkdir test1 test2 test3
最后一个问题,什么时候来执行呢?这个就看具体的策略 ...
shell--解决数组拼接变成一行
问题碰到了一个奇怪的问题,脚本在执行推送数据任务的时候,总是会有两个节点是失败的,确认环境都是相关的,有可能是脚本有毛病,加了堆日志后发现确实有问题。因为之前修改数组拼接的方法。
出现问题的shell123456789101112131415161718192021222324#!/usr/bin/bashdevNet=(10.40.100.11410.40.100.115)testNet=(#10.40.100.11110.40.100.110)testFn() { local nodes=("$@") for node in "${nodes[@]}"; do echo "[info]: restart node: $node" done}# 就因为用 " " 包起来了所以就出问题了,把两行当成一行处理allNode=("${devNet[@]} ${testNet[@]}")testFn & ...
shell--ssh解析本地变量到远程失败
问题很多问题都是由于双眼号引起的,但是shell标准确很喜欢让开发者加上双眼号。脚本通过ssh远程操作其它相器,正常情况下脚本会将我本机的脚本变量带到远程机器上,这个脚本一直远行正常。然后看到一个shell的变量使用规范,要在大部分重要的变量是加上又眼号,我就这么干了,然后就出问题了。
正常场景我在本机:192.168.1.100上执行脚本,并登陆:192.168.1.200上操作一下,正常应该打印出:test-abcd,但是由于变量失效,则打印为空。
123456789101112131415161718192021222324#!/bin/bashnodes(192.168.1.101192.168.1.102192.168.1.200)myVar="test-abcd"startNodes() { local nodes=("$@") for node in "${nodes[@]}"; do { echo "[info]: start node: $ ...
shell 变量
shell 变量shell 是解释型的语言,类似的有python。shell 是没有类型的,分局部变量 和 环境变量
局部变量,只在创建shell 的脚本中命名用,其他shell不能访问
环境变量,在当前用户或系统环境中生效
转义字符在 " " 中是起做用的bash 只支持 整数 和 字符串,不支持浮点数,如果要使用浮点数,需要借助 bc。
定义和引用变量12345678#!/bin/sh# 声明变量时,不要出现空格A=123456B='TEST'# 使用一个变量使用 $变量名echo $A
定义变量时,变量名不加$,而在使用变量时,需要加$,格式:$test_var
注意事项变量名和等号之间不能有空格,切记很多时候问题就是出在这里。
变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
使用变量声明变量后,要需要将变量输出,输出变量需要使用 echo $变量名。
1234567 ...
shell 编写Hello World
简述Shell 是一个用 C 写的程序,用于和内核做交互。是一种命令式的语言。解释执行。Shell 和 Shell脚本是两个概念。一般 shell 是指 Shell Script 即 Shell 脚本。
Shell 可以理解成命令的集合,即把命令集合在一个文件,就是脚本,称shell脚本。Bash Shell 最常用echo $BASH 查看当前的 Shell
控制台命令行就是一个 shell。脚本就是一个命令行的集合,和在控制台输入的效果是一样的。但是脚本可以保存这些命令,提升率效。linux 的文件不需要后缀,所以 .sh 可有可无。
Hello World创建一个测试文件 test.sh 然后执行 sh test.sh
12#!/bin/bashecho "Hello World !"
输出结果:
Hello World
你会现,这里我并没有 chmod o+x test.sh 也能执行,网上很多文章说需要先修改执行权,这个后面说明。
Shell1.作为解释器参数
#!必须加这个头!!!!,则文件会以shell脚本形式执行
1#!/bin/bash
使 ...