LinuxShell语言基础(让自动化运维不再是梦)

当下最流行的运维自动化语音就是Shell和Pyhon了

为啥要学shell?

Shell为我们提供了运维工作中快速部署、服务启动停止、数据备份及处理、日志分析等环节,而用py就更牛逼了,可以开发更加复杂,精细度更高的运维工作,甚至能用web实时监控等。

Shell是什么?

Shell其实是一个命令解释器,解释执行用户所输入的命令和程序,且是实时的。

简单来说“shell编程就是对一堆Linux命令的逻辑化处理”

用Shell语言编程的Helloworld(需要对shell命令以及vim有一些了解):

image-20240831204607150

shell 中 # 符号表示注释。shell 的第一行比较特殊,一般都会以#!开始来指定使用的 shell 类型。在 linux 中,除了 bash shell 以外,还有很多版本的 shell, 例如 zsh、dash 等等…不过 bash shell 还是我们使用最多的。

可以用echo $SHELL命令来查看自己用的shell版本 具体切换可百度

Shell变量

1、自己定义的变量:只在当前shell实例中有效
2、Linux自定义的环境变量:像是PATH,HOME 使用env可以查看所有的环境变量,set既可以查看环境变量也可以查看自定义变量
3、Shell变量:有shell程序设置的特殊变量

常用的环境变量:

PATH 决定了 shell 将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE  历史记录数
LOGNAME 当前用户的登录名
HOSTNAME  指主机的名称
SHELL 当前用户 Shell 类型
LANGUAGE  语言相关的环境变量,多语言可以修改此环境变量
MAIL  当前用户的邮件存放目录
PS1  基本提示符,对于 root 用户是#,对于普通用户是$

使用Linux已经定义的环境变量:例如echo $HOME 查看当前用户目录

使用自己定义的变量:

1
2
3
4
5
#!/bin/bash
#自定义变量hello
hello="hello world"
echo $hello
echo "helloworld!"

image-20240901003533437

Shell字符串入门

字符串是 shell 编程中最常用最有用的数据类型(数字也是 这里不多说了)字符串可以用单引号,也可以用双引号

常用操作

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
name="SnailClimb"
# 使用双引号拼接
greeting="hello, "$name" !"
greeting_1="hello, ${name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$name' !'
greeting_3='hello, ${name} !'
echo $greeting_2 $greeting_3

流程控制不想写 用的不多

简单实战一下:快速部署docker的redis集群 需要3对主从节点 并且需要 将端口设置为6001 6002 6003 7001 7002 7003 并生成一个6010端口的哨兵

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/bash
docker rm -f `docker ps --filter name=.*redis-700.* -aq`
echo "1.请输入您要部署的目录位置"
gml=""
while :
do
read path
if [[ "$path" =~ ^([\/]{1}[a-zA-Z]{1,9}){1,5}$ ]];then
gml=$path
break
else
echo "$path不符合linux路径标准"
echo "输入一个合法的根目录如《/path/path1...》"
fi
done
rm -rf $path/redis
mkdir $path
cd $gml
echo "2.正在创建redis目录"
mkdir redis
cd redis
docker pull redis:5.0.4
echo "3.正在创建redis集群模板"
touch redis-cluster.tmpl
echo -e "port \${PORT}\n
protected-mode no\n
cluster-enabled yes\n
cluster-config-file nodes.conf\n
cluster-node-timeout 5000\n
cluster-announce-ip 192.168.2.103\n
cluster-announce-port \${PORT}\n
cluster-announce-bus-port 1\${PORT}\n
appendonly yes">>redis-cluster.tmpl
docker network create redis-net
echo "4.完成模板创建"
echo "5.正在创建redis配置"

for port in `seq 7000 7005`
do
mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf && mkdir -p ./${port}/data
done
echo "6.redis配置创建完成"
ips=""
for port in `seq 7000 7005`
do
docker run --privileged=true -m 200m -d -p ${port}:${port} -p 1${port}:1${port} -v /${gml}/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /${gml}/redis/${port}/data:/d
ata --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis:5.0.4 redis-server /usr/local/etc/redis/redis.conf
echo "7.正在创建redis-$port 容器"

ips="$ips`docker inspect redis-${port} --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}'`:${port} "
done

echo "所有容器中创建完成"
docker exec -it redis-7000 bash -c "echo yes | redis-cli --cluster create $ips --cluster-replicas 1 && exit"
echo "集群启动成功!!!"