shell脚本研究
byfn.sh脚本学习
1 | if [ ! -d "crypto-config" ] #是否存在这个文件 |
shell 脚本中的 $任意符号代表的意思
1 | $# 是传给脚本的参数个数 |
shell脚本中set 命令
set去追踪一段代码的显示情况,执行后在整个脚本有效1
2
3set -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 | 变量(字符串)变换 |
移除匹配的字符串
1 | 定义一个变量filename,该变量的值为pwd所对应的当前路径 |
查找与替换
在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
11tar命令解压时如何去除目录结构及其解压到指定目录 (--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