shell脚本研究


byfn.sh脚本学习

1
if [ ! -d "crypto-config"  ] #是否存在这个文件

shell 脚本中的 $任意符号代表的意思

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用

shell脚本中set 命令

set去追踪一段代码的显示情况,执行后在整个脚本有效

1
2
3
set -x 开启 
set +x关闭
set -o 查看

监控带宽

可以用nethogs

shell 打包脚本

由于直接使用docker pull无法从服务器pull下来镜像,我们采用个人的服务器作为中转,将镜像pull至阿里云服务器,通过docker save 打包,然后通过docker load载入。打包脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#docker images > ./images.txt 
#awk '{print $1}' ./images.txt > ./out.txt
IMAGES=$(docker images | awk '{printf("%s:%s %s %s\n", $1,$2,$3,$4)}'| grep "hyperledger")
echo "${IMAGES}" | while read line
do
NAMES=$(echo "${line}" | awk '{printf $2}')
VERSION=$(echo "${line}" | awk '{printf $1}')
#echo "${NAMES}"
docker save -o $NAMES".tar" $VERSION
#echo "${line}"
done

IMAGES=$(docker images | awk '{printf("%s %s %s %s\n",$1,$2,$3,$4)}')
echo $IMAGES
a=1
echo "$IMAGES" | while read line
do
if [ $a -eq 1 ];then
echo "skip"
a=2
else
IMAGE_NAME=$(echo $line | awk '{printf("%s",$1)}')
IMAGE_VERSION=$(echo $line | awk '{printf("%s\n",$2)}')
if [ $IMAGE_VERSION = "<none>" ];then
echo "skip"
else
IMAGE=$IMAGE_NAME":"$IMAGE_VERSION
NAME=$(echo $line | awk '{printf("%s",$3)}')
NEW_IMAGE=$IMAGE_VERSION"."$NAME
docker save -o $NEW_IMAGE".tar" $IMAGE
fi
fi
done

脚本中 awk 用来提取某一列元素,IMAGES=\$(命令)是将命令执行的结果赋值给变量,注意等式前后两侧均不留空隙,字符串的连接可以通过直接跟上”字符串”即可。echo “${var}$”可以按照原来的格式输出变量,如果只是echo “\$VAR” 或者 echo \$VAR输出的会没有换行。

过滤特定的文件

不显示包含某些特定词的文件
方案一

1
find ./ -not -name "*.yaml"

方案二

1
ls | egrep -v yaml

大小写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
变量(字符串)变换
定义一个变量t,内容为framE
[root@vm1 tmp]# t=framE
查看变量t的内容:echo $t或者是echo ${t}
[root@vm1 tmp]# echo $t
framE
[root@vm1 tmp]#
将变量t的首字母大写:echo ${t^}
[root@vm1 tmp]# echo ${t^}
FramE
[root@vm1 tmp]#
将变量t的所有字母大写:echo ${t^^}
[root@vm1 tmp]# echo ${t^^}
FRAME
[root@vm1 tmp]#
将变量t的首字母小写:echo ${t,}
[root@vm1 tmp]# echo ${t,}
framE
[root@vm1 tmp]#
将变量t的所有字母小写:echo ${t,,}
[root@vm1 tmp]# echo ${t,,}
frame
[root@vm1 tmp]#
将变量t的首字母大小写切换:echo ${t~}
[root@vm1 tmp]# echo ${t~}
FramE
[root@vm1 tmp]#
将变量t的所有字母大小写切换:echo ${t~~}
[root@vm1 tmp]# echo ${t~~}
FRAMe
总结:
^:首字母大写
^^:所有字母大写
,:首字母小写
,,:所有字母小写
~:首字母大小写切换
~~:所有字母大小写切换

移除匹配的字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
定义一个变量filename,该变量的值为pwd所对应的当前路径
[root@vm1 network-scripts]# filename="$(pwd)"
[root@vm1 network-scripts]# echo $filename
/etc/sysconfig/network-scripts
[root@vm1 network-scripts]#
从前往后删,删除掉最短的一个"/"
[root@vm1 network-scripts]# echo ${filename#*/}
etc/sysconfig/network-scripts
[root@vm1 network-scripts]#
从前往后删,删除掉最长的一个"/"
[root@vm1 network-scripts]# echo ${filename##*/}
network-scripts
[root@vm1 network-scripts]#
从后往前删,删除掉最短的一个"/"
[root@vm1 network-scripts]# echo ${filename%/*}
/etc/sysconfig
[root@vm1 network-scripts]#
从后往前删,删除掉最短的一个"/"
[root@vm1 network-scripts]# echo ${filename%%/*}
[root@vm1 network-scripts]#
#:从前往后删,删除掉最短的一个
##:从前往后删,删除掉最长的一个
%:从后往前删,删除掉最短的一个
%%:从后往前删,删除掉最长的一个

查找与替换

在ubuntu上通过find查找文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
查看变量filename的内容:
[root@vm1 network-scripts]# echo $filename
/etc/sysconfig/network-scripts
[root@vm1 network-scripts]#

将第一次出现的小写s替换成大写的S
[root@vm1 network-scripts]# echo ${filename/s/S}
/etc/Sysconfig/network-scripts
[root@vm1 network-scripts]#

将所有的小写s替换成大写的S
[root@vm1 network-scripts]# echo ${filename//s/S}
/etc/SySconfig/network-ScriptS
[root@vm1 network-scripts]#
总结:
/match/value:将第一次出现的match地换成value
//match/value:将所有的match替换成value
其他字符串的操作符
查询字符串的长度:echo {#filename}
[root@vm1 network-scripts]# echo ${#filename}
30
[root@vm1 network-scripts]#

字符串切片操作:${filename:offset:length} offset从0开始
[root@vm1 network-scripts]# echo ${filename:5:9}
sysconfig
[root@vm1 network-scripts]#

解压文件

在Linux下使用tar解压文件

1
2
3
4
5
6
7
8
9
10
11
tar命令解压时如何去除目录结构及其解压到指定目录 (--strip-components N)
去除目录结构加上 --strip-components N
如: 压缩文件eg.tar 中文件信息为 src/src/src/eg.txt
运行 tar -xvf eg.tar --strip-components 1
结果:src/src/eg.txt
如果运行 tar -xvf eg.tar --strip-components 3
解压结果为: eg.txt
在解压的时候,如果想指定解压目录,可以加参数-C 目标目录
如: 如我们解压eg.tar, 该文件在/data/src下面,如果需要将基解压到/data/dst目录下面,我们可以在/data/dst目录下,运行 tar -xvf /data/src/eg.tar 也可以在/data/src目录下面运行
tar -xvf eg.tar -C /data/dst
tar -tvf 不解压查看文件包内容

ubuntu查看硬件配置信息

在ubuntu下查看CPU、内存、以及硬盘相关信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
### 查看CPU相关信息
root@s3cana:~# lscpu
Architecture: i686 #架构686
CPU(s): 2 #逻辑cpu颗数是2
Thread(s) per core: 1 #每个核心线程数是1
Core(s) per socket: 2 #每个cpu插槽核数/每颗物理cpu核数是2
CPU socket(s): 1 #cpu插槽数是1
Vendor ID: GenuineIntel #cpu厂商ID是GenuineIntel
CPU family: 6 #cpu系列是6
Model: 23 #型号23
Stepping: 10 #步进是10
CPU MHz: 800.000 #cpu主频是800MHz
Virtualization: VT-x #cpu支持的虚拟化技术VT-x
L1d cache: 32K #一级缓存32K(cpu的L1数据缓存32k)
L1i cache: 32K #一级缓存32K(L1指令缓存32K)
L2 cache: 3072K #二级缓存3072
## 查看CPU型号
root@s3cana:~# # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
### 查看内存信息
root@s3cana:~# cat /proc/meminfo
### 查看外存信息
root@s3cana:~# df -h

shell 自动交互

The authenticity of host ‘[120.78.203.136]:3211 ([120.78.203.136]:3211)’ can’t be established.
ECDSA key fingerprint is SHA256:s/1ylOl1ZIIWaw7C79dXook/aSalmh7SVL+J8rSKMkY.
Are you sure you want to continue connecting (yes/no)?

expect 安装

1
sudo apt-get install tcl tk expect

执行

1
2
#!/usr/bin/expect
chmod +x filename