Linux运维之道之ENGINEER1.4(shell脚本基础)
ENGINEER1.4SHELL脚本基础
认识shell环境
bash shell的使用方式
交互式:
--人工干预,智能化程度高
--逐条解释执行,效率低
非交互式:
--需要提前设计,智能化难度大;
--批量执行,效率高;
--方便在后台及悄悄地执行;
什么是shell脚本:提前设计可执行语句,用来完成特定任务的文件
--解释型程序
--顺序,批量执行
规范shell脚本的一般组成:
#!环境声明
#注释文本
可执行代码
----------------------------------------------------------------------------------------------------------------------------------
例1:
编写helloworld.sh问候脚本
[*] 编写脚本代码:
#vim/root/helloworld.sh
#!/bin/bash
echo “helloworld”
[*] 添加x执行权限
#chmod+x/root/helloworld.sh
[*] 运行脚本测试
#/root/helloworld.sh
例2:
编写系统信息报告脚本
[*] 编写脚本代码:
#vim/root/1.sh
#!/bin/bash
cat/etc/redhat-release
uname-r
hostname
2.添加x执行权限
# chmod+x /root/1.sh
3.运行脚本测试:
#/root/1.sh
--------------------------------------------------------------------------------------------------------------------------------------
简单脚本技巧
重定向输出的应用
>:只收集正确 2>:只收集错误 &>:全部收集
本例要求编写一个脚本 /root/out.sh,功能特性如下:
[*] 执行此脚本显示Ilovestudy !!
[*] 执行 /root/out.sh2>err.log 应该没有显示,但是查看 err.log 文件的内容为Ilovestudy !!
步骤:
[*] #vim /root/out.sh
#!/bin/bash
#echo"ilove study!!" >&2
[*] #chmod-x /root/out.sh
[*] #/root/out.sh
[*] #/root/out.sh2>err.log
[*] #cat err.log
----------------------------------------------------------------------------------------------------------------------------------------
变量的定义及使用
以不变的名称存放可能变化的值
引用变量值:$变量名 以{}界定易混淆名称
变量的种类:
根据变量的用途不同区分:
环境变量:变量名一般都大写,用来设置用户,系统环境 (PATH)
位置变量:bash内置,存储内置脚本时提供的命令行参数 $n ,n为序号$1 $2 ...${10}
预定义变量:bash内置,可直接调用的特殊值,不能直接修改
$#:已加载的位置变量的个数 $*:所有位置变量的值$?:程序退出后的状态值,0表示正常,其他异常
自定义变量:用户自主设计,修改和使用
例:
要求编写一个脚本 /root/myhead,功能特性如下:
此脚本可接收2个位置参数,能够按照下列格式执行
此脚本执行后,能显示“你一共提供了 $# 个参数”,然后在下一行显示“文件 $1 的前 $2 行: ”,紧跟下一行开始输出对应文件的前几行内容
步骤一:编写 /root/myuseradd 添加用户的脚本
#vim/root/myuseradd
#!/bin/bash
echo“一共提供了$#个参数”
echo "用户名是$1,密码是$2 "
useradd $1
echo "$2" |passwd--stdin $1
二.添加执行权限
#chmod-x/root/myuseradd.sh
----------------------------------------------------------------------------------------------------------------------------------------------
常用测试选项:
[*] 文件状态检测-f、-d、-e、-r、-w、-x
[*] 整数值比较-gt、-ge、-eq、-ne、-lt、-le
[*] 字符串比较==、!=
[*] 取反操作!
多分支if选择结构:
if条件测试操作1 then命令序列1
elif 条件测试操作2 then命令序列2
else命令序列3
fi
例:
本例要求在虚拟机 server0 上创建 /root/foo.sh 脚本,任务目标如下:
[*] 当运行/root/foo.sh redhat,输出为fedora
[*] 当运行/root/foo.sh fedora,输出为redhat
[*] 当没有任何参数或者参数不是 redhat 或者 fedora时,其错误输出产生以下信息: /root/foo.sh redhat|fedora
1)编写脚本代码
# vim/root/foo.sh
#!/bin/bash
if [ "$1" = "redhat" ]
then
echo "fedora"
elif [ "$1" = "fedora" ]
then
echo "redhat"
else
echo "/root/foo.sh redhat|fedora" >&2
fi
2)添加x执行权限
# chmod+x/root/foo.sh
步骤二:测试foo.sh判断脚本
1)测试提供正确参数的情况
# /root/foo.shredhat fedora
# /root/foo.shfedora Redhat
2)测试提供非预期参数的情况
# /root/foo.shubuntu
/root/foo.sh redhat|fedora
3)测试不提供参数的情况
# /root/foo.sh
/root/foo.sh redhat|fedora
页:
[1]