Shell脚本:一个可运行的文件,可实现某种功能。
书写规范:
#! 环境声明(以下的代码由哪个程序翻译)
# 注释文本
可执行代码
变量的种类
1.环境变量:变量名一般大写,由系统定义完成,用户直接使用。
USER=永远储存当前系统登陆的用户名。
echo $USER #如果切换到其他用户,也会变成相应用户。
PATH:存储命令程序的路径
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
cp /root/hello.sh /usr/bin #必须放入PATH的路径才能生效
hello.sh #执行成功
2.位置变量:由系统定义完成,用户直接使用,非交互式。
在执行脚本时,提供的命令行参数
表示为 $n,n为序号。如$1、$2、$3 、$4.. .. ${10}、${11}..
利用位置变量实现
vim /root/user.sh
#!/bin/bash
useradd $1 &> /dev/null
echo $1创建成功
echo 123 | passwd --stdin $1 &> /dev/null
echo $1密码设置成功
/root/user.sh lisi
vim /root/1.sh
#!/bin/bash
cat -n $1 | head -$2
/root/1.sh /etc/passwd 3
3.预定义变量:由系统定义完成,用户直接使用。
用来保存脚本程序的执行信息
不能直接为这些变量赋值
$# 用户输入位置变量的个数
$* 所有位置变量的值
$? 程序退出后的状态值,0表示正常,其他值异常
vim /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $# #输出一共有多少个参数(求和)
echo $* #输出所有位置变量的值
/root/2.sh haha xixi hehe lele
4.自定义变量:用户自主设置、修改及使用。
单引号 ' ' 来取消所有特殊字符的含义。
变量:相当于容器,以不变的名称,存储可变化的值。
变量名=变量值 (为变量赋值)
作用:增加脚本的灵活度,适用多变的环境。
设置变量名要注意:
1,只能由(字母/数字/下划线)组成,区分(大小写)
2,不能以(数字)开头,不要使用(关键字,特殊字符)
3,若指定的变量名已存在,相当于(为此变量重新赋值)
4,等号两边(不要有空格)
引用变量值:$变量名
查看变量值:echo $变量名、 echo ${变量名}
a=rhel
echo $a
echo $a7
echo ${a}7
read:
1.产生交互
2.记录用户在键盘上的输入
3.将记录的信息赋值给变量
-p:让屏幕提示信息''
vim /root/user.sh
#!/bin/bash
read -p '请输入您要创建的用户:' abc
useradd $abc &> /dev/null
echo $abc创建成功
echo 123 | passwd --stdin $abc &> /dev/null
echo $abc密码设置成功
利用Shell运行一个文件,可执行命令,输出:hello world
vim /root/hello.sh
#!/bin/bash
echo hello world
chmod +x /root/hello.sh #加上执行权限
ls -l /root/hello.sh
/root/hello.sh
--------------------------------------------------------------------------------------------------------------------
常用的测试选项,检查文档状态:
-e:文档存在为真
-d:文档存在,且为目录才为真
-f:文档存在,且为文件才为真
-r:文档存在,且有读取权限才为真
-w:文档存在,且有写入权限才为真
-x:文档存在,且有执行权限才为真
比较整数大小
-eq:等于
-ne:不等于
-gt:大于
-ge:大于等于
-lt:小于
-le:小于等于
[ 1 -gt 2 ]
echo $? # $? 上条命令的输出结果,为0是正确,其它数字是错误
字符串比对
==:两个字符串相等为真
!=:两个字符串不相等为真
[ student != root ]
[ $USER == root ]
echo $?
if双分支处理
if [条件测试];then
命令序列xx
else
命令序列yy
fi
利用read实现交互 ??????
用户输入一个用户名,脚本判断用户所输入的用户是否存在?
如果存在,输出用户存在。
如果不存在,输出用户不存在。
vim /root/if01.sh
#!/bin/bash
read -p '请输入您要测试的用户名:' user
id $user &> /dev/null
if [ $? -eq 0 ];then #判断上一条命令是否成功
echo $user用户已存在
else
echo $user用户不存在
fi
利用位置变量实现命令行传递参数。 ?????ping 00000000居然可以通信
参数为IP地址,脚本判断用户所输入IP地址,是否本机可以ping通?
如果可以ping,输出 可以通信。
如果不可以ping,输出 不可以通信。
vim /root/if02.sh
#!/bin/bash
ping -c 2 $1 &> /dev/null
if [ $? -eq 0 ];then
echo $1 本机可以通信
else
echo $1 本机不可以通信
fi
/root/if02.sh 192.168.1.1
优化:
vim /root/if02.sh
#!/bin/bash
if [ $# -eq 0 ];then #判断用户是否输入参数
echo 格式错误,请在脚本运行时添加参数
echo 参数为IP地址
else
ping -c 2 $1 &> /dev/null
if [ $? -eq 0 ];then
echo $1 本机可以通信
else
echo $1 本机不可以通信
fi
fi
for循环结构:让计算机重复执行一个操作
for 变量名 in 值列表
do
命令序列
done
for a in zhangsan lisi wangwu dc
do
useradd $a
echo 123 | passwd --stdin $a
done
造数: {起始数值..结束数值}
cat /root/for01.sh
#!/bin/bash
for a in {1..20}
do
useradd stu$a &> /dev/null
echo stu$a创建成功
done
/root/for01.sh
$( ) 或 反撇号 ` `
将命令的输出,作为另一个命令的参数,参与下一个命令的运行
date +%F
2018-09-12
cd /mnt
mkdir nsd-`date +%F`
mkdir $(hostname)-$(date +%F)
ls
扩展案例:
vim /root/user.txt
yuanxiao
qingming
duanwu
wuyi
liuyi
wusi
......
请利用for循环:
该文件/root/user.txt内容,每一行为一个用户的名称,创建/root/user.txt文件中所有用户
#!/bin/bash
a=`cat /root/user.txt`
for b in $a
do
useradd $b &> /dev/null
echo $b用户创建成功!
done
if多分支处理
if [条件测试1];then
命令序列xx
elif [条件测试2];then
命令序列yy
elif [条件测试3];then
命令序列cc
......
else
命令序列zz
fi
利用read交互,让用户输入考试成绩
进行如下判断
如果成绩大于90 则 输出 优秀
如果成绩大于80 则 输出 良好
如果成绩大于70 则 输出 一般
如果成绩大于60 则 输出 合格
以上条件均不满足 , 则 输出 再牛的肖邦,也弹不出哥的悲伤
vim /root/if03.sh
#!/bin/bash
read -p '请输入您的成绩:' num
if [ $num -ge 90 ];then
echo 优秀
elif [ $num -ge 80 ];then
echo 良好
elif [ $num -ge 70 ];then
echo 一般
elif [ $num -ge 60 ];then
echo 合格
else
echo 再牛的肖邦,也弹不出哥的悲伤
fi