Shell脚本基础 、 使用变量 、 条件测试及选择 、 列表式循环

时间:2022-12-01 21:44:19

————————Shell脚本基础 、 使用变量 、 条件测试及选择 、 列表式循环————

【Shell脚本基础 】

<< Shell环境 >>

< Shell 脚本概念 >
提前设计可执行语句,用来完成特定任务的文件
--解释型程序
--顺序、批量执行
常见脚本语言
Bash Shell
Python/Perl/Rudy
JSP/PHP/ASP/CGI
JavaScript

< Bash Shell 使用方式 >
交互式
--人工干预、智能化程度高
--逐条解释执行、效率低
非交互式
--需提前设计、智能化程度大
--批量执行、效率低
--便于后台安静运行
规范Shell脚本的一般组成
#!/bin/bash 环境声明(Sha-Bang)
# 注释文本
可执行代码
< 第一个Shell脚本 >
脚本创建过程
1)明确任务要求
--按自然语言拆分小步骤
--按顺序整理
2)编写代码文件
--每一步骤如何实现
--转换成命令行保存到脚本文件
3)测试并完善
--运行脚本,排除错误
--代码优化

脚本运行及调试
1)编写脚本
vim /root/sysinfo
--->
#!/bin/bash
cat /etc/redhat-release
uname -r
hostname
2)添加执行权限
chmod +x /root/sysinfo
3)运行测试
/root/sysinfo
--->
Red Hat Enterprise Linux Server...
3.10.0-123.el7.x86_64
server0.example.com
4)检查排错
sh -x /root/sysinfo
--->
+ cat /etc/redhat-release
Red Hat Enterprise Linux Server...
+ uname -r
3.10.0-123.el7.x86_64
+ hostname
server0.example.com
【简单脚本技巧】
管道传递
将前一条命令的输出结果交给后一条命令处理
命令1 | 命令2 [|命令3]
ls --help | less 传递多屏文本
免交互处理
记录有价值的信息 >> /var/log/foo.log 追加式
屏蔽无价值的、干扰性的信息 &> /dev/null 黑洞文件
自定义输出 echo '文本字符串'
重定向输出
标准输出(1):正常结果
标准错误(2):错误或异常结果
输出结果保存到文件
cmd > file、cmd >> file
cmd 2> file、cmd 2>> file
cmd &> file 正确错误都记录
cmd 1> file 2>&1 正确错误都是错
cmd 2> file 1>&2 正确错误都是错
1>&2、>&2 标准输出--->标准错误
2>&1 标准错误--->标准输出

【使用变量】
变量的定义
变量名=变量值
固定名称代替值,“传参”
减少代码量
赋值时
1)变量已存在,覆盖原值
2)=两边不能空格
3)变量名组成:abc、123、_,区分大小写
4)不能以数字开头,不能使用关键字、特殊字符
基本格式
引用变量值:$变量名
查看变量值:
echo $变量名、echo ${变量名}
var=CentOS var7.2=CentOS2
echo $var ---> CentOS
echo $var6.7 ---> CentOS6.7
echo $var 7.2 ---> CentOS7.2
echo ${var}7.2 ---> CentOS2 以{}界定混淆名称
【变量种类】
1)环境变量
变量名大写,用来设置用户/系统环境
PWD、PATH、USER、LOGNAME、SHELL、HOME
2)位置变量
bash内置,存储执行脚本时提供的命令行参数
$n n=1、2、3...
3)预定义变量
bash内置,直接使用,不能直接赋值
用来保存脚本程序的执行信息
$# 已加载的位置变量个数
$* 所有位置变量的值
$? 程序退出后的状态值,0表示正常,其他值不正常
4)自定义变量
用户自主设置
【特殊变量使用三部曲】
1.编写脚本代码
vim /root/useradd
--->
#!/bin/bash
echo "一共提供了 $# 个参数"
echo "成功添加用户 $1,密码是 $2 "
useradd $1
echo "$2" | passwd --stdin $1
2.添加x执行权限
chmod +x /root/useradd.sh
3.添加用户和密码,并测试
/root/useradd kenji 123
--->
一共提供了 2 个参数
成功添加用户kenji,密码是123
更改用户kenji的密码
passwd:所有的身份验证令牌已经成功更新


条件测试及选择
【条件测试】
Shell测试依据
命令行/程序退出状态值$?
值=0,执行成功
值不为0,失败/异常
脚本退出状态值:退出之前最后一条命令的$?
也可自行替换,添加exit整数
测试操作
正常命令行
tsxt -选项 参数
[测试表达式]
id fleyd &> /dev/null 测试操作
echo $? ---> 1 状态值为1,表示失败
[100 -gt 50] 测试表达式
echo $? ---> 0 状态值为0,表示成功
常用测试选项
检查文件状态
-e 文档
-d 目录
-f 存在
-r 可读
-w 可写
-x 执行
比较整数大小
-gt grent than 大于
-ge 大于或等于
-eq 等于
-ne 不等于
-lt 小于
-le 小于或等于
字符串比对
- == != ! 取反

【if选择结构】
if单分支
if ... ;then ...
fi
if双分支
if ... ;then ...
else ...
fi
if多分支
if ... ;then ...
elif ... ;then ...
else ...
fi
列表式循环
【for循环结构】
遍历/列表式循环
for 变量名 in 值列表 对于变量在列表中...
do .. 做...处理
done 完成
$(命令行)
先执行括号,再把值作为外部命令执行参数
cat /root/userlist
--->
haha
xixi
kenji
echo $(cat /root/userlist)
--->
haha xixi kenji
【编写批量添加用户脚本】
1.编写脚本代码
vim /root/batchusers
--->
#!/bin/bash
if [ $# -eq 0 ]
then
echo "Usage:/root/batchusers <userfile>"
exit 1
fi

if [ ! -f $1 ]
then
echo "Input file not found"
exit 2
fi

for name in $(cat $1)
do
useradd -s /bin/false $name
done
2.添加x执行权限
chmod +x /root/batchusers
3.测试脚本
1)准备文件
wget http://classroom/pub/materials/
userlist -O /root/userlist
2)批量添加用户
/root/batchusers /root/userlist
3)测试
/root/batchusers 未提供列表文件
---> Usage: /root/batchusers <userfile>
echo $? ---> 1
/root/batchusers /root/userlist.txt
---> Input file not found 提供的列表文件找不到
echo $? ---> 2