Shell脚本
• 脚本: 可以执行文件,实现某种功能
• 提前设计可执行语句,用来完成特定任务的文件(命令的堆积)
规范Shell脚本的一般组成 • #! 环境声明(Sha-Bang) 以下所有代码,用那个程序解释 • # 注释文本 • 可执行代码
[root@server0 ~]# cat /root/hello.sh #!/bin/bash echo hello world hostname uname -r ifconfig | head -2 | tail -1 cat /etc/redhat-release
[root@server0 ~]# /root/hello.sh
#################################################### 重定向输出
: 只收集正确信息的重定向 2>: 只收集错误信息的重定向 &>: 收集正确与错误信息的重定向
[root@server0 ~]# echo 123 > /opt/1.txt [root@server0 ~]# cat /opt/1.txt [root@server0 ~]# cat /etc
[root@server0 ~]# cat /opt/1.txt /etc/ [root@server0 ~]# cat /opt/1.txt /etc/ > /mnt/a.txt [root@server0 ~]# cat /mnt/a.txt
[root@server0 ~]# cat /opt/1.txt /etc/ 2> /mnt/a.txt [root@server0 ~]# cat /mnt/a.txt
[root@server0 ~]# cat /opt/1.txt /etc/ &> /mnt/a.txt [root@server0 ~]# cat /mnt/a.txt
运算: [root@server0 ~]# echo 1+2 | bc
[root@server0 ~]# echo 2*3 | bc
[root@server0 ~]# echo 4/2 | bc
[root@server0 ~]# echo 10%3 | bc #取余数运算
$( ):将命令的输出结果,作为参数
[root@server0 ~]# rm -rf /opt/* [root@server0 ~]# cd /opt/
[root@server0 opt]# date
[root@server0 opt]# date +%F #输出年月日
[root@server0 opt]# mkdir $(date +%F) [root@server0 opt]# ls
[root@server0 opt]# mkdir mydir-$(date +%F) [root@server0 opt]# ls
[root@server0 opt]# mkdir $(hostname)-$(date +%F) [root@server0 opt]# ls
''(单引号):取消特殊字符的意义
[root@server0 /]# echo '* >'
[root@server0 /]# echo '* > ? {} [] ~'
#####################################################
/dev/null:黑洞设备
变量:为了增加脚本适用环境的能力,以及方便适用
变量作用:以不变的名称,存储变化的值(容器)
read 产生交互:为了降低脚本的使用难度
[root@server0 /]# cat /root/user.sh #!/bin/bash read -p '请输入您要创建的用户名:' user useradd $user &> /dev/null echo $user用户创建成功 echo 123 | passwd --stdin $user &> /dev/null echo $user用户密码设置成功
[root@server0 /]# /root/user.sh
#!/bin/bash read -p '请输入您要创建的用户名:' user read -p '请输入您要设置的密码:' pass useradd $user &> /dev/null echo $user用户创建成功 echo $pass | passwd --stdin $user &> /dev/null echo $user用户密码设置成功
################################################# 变量的定义
• 以不变的名称存放的可能会变化的值 – 变量名=变量值 – 方便以固定名称重复使用某个值 – 提高对任务需求、运行环境变化的适应能力
• 设置变量时的注意事项 – 若指定的变量名已存在,相当于为此变量重新赋值 – 等号两边不要有空格 – 变量名由字母/数字/下划线组成,区分大小写 – 变量名不能以数字开头,不要使用关键字和特殊字符
• 基本格式 – 引用变量值:$变量名 – 查看变量值:echo $变量名、echo ${变量名}
[root@server0 /]# a=rhel [root@server0 /]# echo $a [root@server0 /]# echo ${a}
[root@server0 /]# echo $a7
[root@server0 /]# echo ${a}7
环境变量 • 常见的环境变量 – USER(当前登陆的用户) – RANDOM(储存一个随机数)
位置变量 • 在执行脚本时提供的命令行参数 – 表示为 $n,n为序号 – $1、$2、.. .. ${10}、${11}、.. ..
[root@server0 /]# vim /root/2.sh
#!/bin/bash echo $1 echo $2 echo $3
[root@server0 /]# /root/2.sh hello tom harry
[root@server0 /]# vim /root/3.sh
#!/bin/bash cat -n $1 | head -$2
[root@server0 /]# /root/3.sh /etc/passwd 3
预定义变量
$# 已加载的位置变量的个数 $* 所有位置变量的值 $? 程序退出后的状态值,0表示正常,其他值异常
[root@server0 ~]# cat /root/3.sh #!/bin/bash echo $1 echo $2 echo $# echo $*
[root@server0 ~]# /root/3.sh haha xixi hehe lele
###################################################### 常用的测试选项 • 检查文件状态 -e:存在为真 -d:存在且为目录才为真 -f:存在且为文件才为真 -r:存在且具备读取权限才为真 -w:存在且具备写入权限才为真 -x:存在且具备执行权限才为真
• 比较整数大小(带e字母的都有“等于”二字) -gt:大于 -ge:大于等于 -eq:等于 -ne:不等于 -lt:小于 -le:小于等于
• 字符串比对 ==:相等为真 !=:不相等为真
####################################################
if双分支处理
if [条件];then 命令序列xx else 命令序列yy fi
请书写脚本: 用户输入一个用户名,判断用户是否存在 如果存在 输出用户/etc/passwd相应一行 如果不存在 则创建该用户
[root@server0 ~]# vim /root/6.sh
read -p '请输入一个用户名:' user
id $user &> /dev/null
if [ $? -eq 0 ];then
grep $user /etc/passwd
else
useradd $user
echo $user 创建成功
fi
[root@server0 ~]# /root/6.sh
请书写脚本:
计算机随机产生一个10以内的随机数
用户随机输入一个10以内的随机数
如果相等,则中奖了
如果不相等,则谢谢回顾
[root@server0 ~]# vim /root/7.sh
#!/bin/bash read -p '请输入一个10以内的随机数字:' num1 num2=$(echo $RANDOM % 10 | bc) if [ $num1 -eq $num2 ];then echo 恭喜您,中奖了 else echo 恭喜您,谢谢回顾 echo 正确数字为$num2 fi
[root@server0 ~]# /root/7.sh
if多分支处理
if [条件1] ; then 命令序列xx elif [条件2] ; then 命令序列yy elif [条件3] ; then 命令序列aa else 命令序列zz fi
请书写脚本:
请用户输入积分.
如果用户的积分大于等于90,输出 vip plus
如果用户的积分大于等于80,输出 vip
如果用户的积分大于等于70,输出 老司机
如果用户的积分大于等于60,输出 新手
以上均不满足,输出 仍需努力
[root@server0 ~]# vim /root/8.sh #!/bin/bash read -p '请用户输入积分:' num if [ $num -ge 90 ];then echo VIP PLUS elif [ $num -ge 80 ];then echo VIP elif [ $num -ge 70 ];then echo 老司机 elif [ $num -ge 60 ];then echo 新手 else echo 仍需努力 fi
##################################################
案例4:编写一个判断脚本 在 server0 上创建 /root/foo.sh 脚本 1)当运行/root/foo.sh redhat,输出为fedora 2)当运行/root/foo.sh fedora,输出为redhat 3)当没有任何参数或者参数不是 redhat 或者 fedora时,其错误输出产生以下信息: /root/foo.sh redhat|fedora
[root@server0 ~]# vim /root/foo.sh #!/bin/bash if [ $# -eq 0 ];then echo '/root/foo.sh redhat|fedora' >&2 exit 2 elif [ $1 == redhat ];then echo fedora elif [ $1 == fedora ];then echo redhat else echo '/root/foo.sh redhat|fedora' >&2 exit 3 fi
[root@server0 ~]# /root/foo.sh [root@server0 ~]# echo $? [root@server0 ~]# /root/foo.sh 2> /opt/2.txt [root@server0 ~]# cat /opt/2.txt
##################################################
for循环结构
循环作用:让计算机,反复执行重复性的操作
for 变量 in 值列表
do
执行的动作
done
[root@server0 ~]# vim /root/10.sh #!/bin/bash for user in kenji natasha tom harry jack do useradd $user echo $user 成功 done
[root@server0 ~]# /root/10.sh
#######################################################