《Linux运维之道》 丁明一
Shell与Python区别:
Python是调用模块\通用的设计语言
Shell是调用命令\Linux系统自动化维护
1.Shell格式
扩展名一般是 .sh
cat /etc/shells 查看Shell的解释器
正文第一行必须是解释器:
#!/bin/bash或者#!/bin/sh
#注释
调用命令的代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190805094229915.png
2,执行Shell脚本
1,加权限,相对路径或者绝对路径执行
2,没有权限,解释器 脚本名 (bash test.sh)
3,source 脚本名 (不启动子进程,相当于脚本上所有代码都是直接在命令行上运行)
(启动子进程,相当于代码在脚本里执行)
如下脚本
正常执行,脚本关闭,终端没啥反应
source执行,相当于在命令行输入exit,就会退出终端
3,变量(用$ 取变量的值)
1,自定义变量,预设变量
1,自定义变量格式:
变量名=值 (不能有空格)
Shell的变量属于弱类型
变量名:字母,数字,下划线,不能以数字开头
2,调用变量的格式:
echo $变量名
拼接
price=12
echo ${price}RMB
或者加一些拼接符,但是输出的格式会不一样
3,预设变量
echo $USER $UID $PWD $PATH
$? 返回上一条命令执行的状态 (0代表正确,非0代表失败)
PATH存储的是 命令 的搜索路径(类似于配置环境变量)(以冒号为分隔)
添加路径:PATH=$PATH:/home/tarena
4,echo $$ 查看当前进程号
命令行的话 查看的是bash的进程号
脚本的话 查看的是脚本的进程号
#!/bin/bash
脚本代码
if 条件:
kill $$
5,$! 前一个后台执行的进程号
6,sleep 100 & 表示在后台执行 休眠100秒
7,$1,$2,$3,…脚本的位置变量(相当于传参)
vim test.sh
echo $1
echo $2
echo $#
echo $*
chmod +x test.sh
# $1脚本的第一个参数
# $2脚本的第二个参数
# $# 所有参数的个数
# $*所有参数的值
8,read命令 读取用户的输入 (相当于input)
read -p 提示信息 变量名
read -t 3 -p “请输入:” num 表示限制3秒内不输入值,自动结束
read -p '提示信息:'
~$:read 变量名
createuser.sh
#!/bin/bash
# 创建系统用户
read -p 请输入用户名: username
read -p 请输入密码: passwd
useradd $username
echo "$username:$passwd" | chpasswd
4,判断(对数字,字符,文件或目录…进行判断)
判断的语法格式:
[ 判断语句 ] 注意:方括号和判断语句之间必须有空格
&& 并且 A命令 && B命令 表示 仅当A成功时才执行B
|| 或者 A命令 || B命令 表示 仅当A失败时才执行B
1,字符判断
[ A == A ] #相等(等号两边需要空格)
[ A != B ] #不相等
[ -z $变量 ] 判断变量是否为空,为空返回True,不为空返回False
[ $USER == root ] && echo Y || echo N
[ $USER != root ] && exit
2,数字判断
-eq 等于(equal)
-ne 不等于(not queal)
-gt 大于(greater than)
-ge 大于等于(great or equal)
-lt 小于(lese than)
-le 小于等于(less or equal)
[ 5 -gt 3 ] && echo Y || echo N
[ 5 -ge 3 ] && echo Y || echo N
3,文件或目录判断是否存在
[ -e 文件或目录 ] #是否存在exist
[ -f 文件 ] # 存在且为文件file
[ -d 目录 ] # 存在且为目录directory
[ -r 文件或目录 ] # 判断是否可读read
[ -w 文件或目录 ] # 判断是否可写write
[ -x 文件或目录 ] # 判断是否可写
5,if 语句语法格式
1),单分支
if 判断条件 ; then # 条件成立,执行下面命令块
命令块
fi # fi结尾
(不用分号,就需要换行了)
if 判断条件
then
命令行
if
2),双分支
if 判断条件 ; then
命令块1
else
命令2
fi
3),多分支
if 判断条件 ;then
命令1
elif 判断条件 ;then
命令2
...
else
命令n
fi
6,数字运算
1),echo $[ 数字 + 数字 ] # + - * / %
2),变量=值
let 变量 + 数字
或者 let 变量=数字 + 数字 # ++ -- += -= /= %=
a=1
let a++
echo $a
echo $[RANDOM % 10] # 取10(不包含)以内的随机数字
echo $[RANDOM % 23] # 取23(不包含)以内的随机数字
7,循环操作
循环操作 for while
1),for 的语法格式:
for 变量 in 值序列
do
命令块
done
2),while循环
while 判断条件
do
命令行
done
防止死循环
while :
do
echo '开始死循环'
sleep 0.1 # 休眠0.1秒 可以有效防止cpu消耗过高
done
echo {20..50}
echo {20..100..5}
echo {a..z}
8,函数
1),定义函数
函数名(){
命令
}
2),调用函数 # 不能写()
函数名
传递参数 通过位置传参 用 $1 $2 $3 ....依次表示
注意:'$a' 表示就是$a
"$a" 表示取a的值
printf "abc"
printf "abc\n"
echo -e "\033[32mOK\033[0m" # \033[32m表示用颜色打印OK \033[0m 表示关闭颜色
systemctl status sshd 查看sshd服务的状态
cecho(){
echo -e "\033[32mOK\033[0m"
}
echo
ping -c1 172.40.91.11 1> a.txt 1表示将正确结果写入a.txt
ping -c1 172.40.91.23 2>a.txt 2表示将错误结果写入a.txt
ping -c1 172.40.91.11 > /dev/null 将原本输出到终端的内容放到这个/dev/null 类似回收站的地方