本文共 4153 字,大约阅读时间需要 13 分钟。
规范Shell脚本的一般组成
• #! 环境声明,下面的代码用哪一个程序来翻译• # 注释文本• 可执行代码脚本:可以执行的一个文本文件,可以实现某种功能vim /root/hello.sh#!/bin/bashecho hello worldcat /etc/redhat-release uname -rhostname ifconfig | head -2ls -l /root/hello.shchmod +x /root/hello.sh 所有人有执行权限/root/hello.sh 绝对路径执行 > :只收集前面命令的正确信息 2>:只收集前面命令的错误信息 &>:收集前面命令的错误信息与正确信息(无论怎么去注入数据都填不满)/dev/null:黑洞设备 它会把你输出的信息都粉碎调[root@server0 ~]# vim /root/user.sh #!/bin/bash useradd nsd05 &> /dev/null echo 用户nsd05创建成功 echo 123 | passwd --stdin nsd05 &> /dev/null echo 用户nsd05密码设置成功[root@server0 ~]# chmod +x /root/user.sh[root@server0 ~]# /root/user.sh
为了增加脚本灵活,适应多变的环境,所以使用变量变量:容器(以不变的名称,存放可以变化的值)变量名=储存的值 使用变量储存的值 $变量名[root@server0 ~]# vim /root/user.sh#!/bin/basha=natsha 定义变量a储存值useradd $a &> /dev/null $a使用变量a储存值echo 用户$a创建成功echo 123 | passwd --stdin $a &> /dev/nullecho 用户$a密码设置成功[root@server0 ~]# /root/user.sh
基本格式引用变量值:$变量名查看变量值:echo $变量名、echo ${变量名}[root@server0 ~]# echo ${a}7 前面是变量,后面是常量单引 ' ' :取消所有特殊字符含义$( )或 反撇号` ` 都是一样的将命令的输出,作为参数参与下一个命令执行[root@server0 ~]# echo '*'*[root@server0 opt]# mkdir MySQL-`date +%F`[root@server0 opt]# ls MySQL-2019-01-06[root@server0 opt]# mkdir $(hostname)MySQL-2019-01-06 server0.example.com
环境变量 变量名一般都大写,用来设置用户/系统环境 系统定义赋值完成,用户直接使用即可 USER=永远储存当前登陆的用户名[root@server0 opt]# echo $USERroot
位置变量 bash内置,存储执行脚本时提供的命令行参数(非交互) 系统定义赋值完成,用户直接使用即可$1 $2 $3.........${10} ${11} ${12}[root@server0 /]# vim /root/1.sh #!/bin/bashecho $1cat -n $1 | head -$2[root@server0 /]# /root/1.sh /etc/passwd 3
让用户体验更好,降低脚本使用难度,让脚本运行产生交互read -p ' :' 1.产生交互,会等待用户输入内容 2.记录用户在键盘上的输入 3.将用户在键盘上的输入,赋值给变量储存预定义变量 bash内置,可直接调用的特殊值,不能直接修改 系统定义赋值完成,用户直接使用即可 $# 已加载的位置变量的个数 $* 所有位置变量的值 $? 程序退出后的状态值,0表示正常,其他值异常[root@server0 /]# vim /root/1.sh#!/bin/bashecho $1echo $2echo $3echo $# 统计一共输入了几个命令行参数echo $* 输出所有的命令行参数echo $? 程序退出后的状态至(一般用数字来表示) 0是正常,非0是不正常条件测试 – [ 测试表达式 ] 条件表达式每一部分都要有空格•检查文件状态 -e:文档存在为真 -d:文档存在,且必须为目录才为真 -f:文档存在,且必须为文件才为真 -r:文档存在,且必须对其有读取权限才为真 -w:文档存在,且必须对其有写入权限才为真 -x:文档存在,且必须对其有执行权限才为真
字符串比对 ==:相等为真 !=:不相等为真比较整数大小 -gt:大于 -ge:大于等于 -eq:等于 -ne:不等于 -lt:小于 -le:小于等于if双分支 if [ 条件测试 ];then 命令序列xx else 命令序列yy fi
[root@server0 /]# vim /root/if01.sh #!/bin/bashif [ $1 -eq 1 ];then echo hello else echo hifiif多分支处理 if [条件测试1];then 命令序列xx 命令序列bb elif [条件测试2];then 命令序列yy elif [条件测试3];then 命令序列aa ...... else 命令序列zz fi
案例: 利用read 读取用户输入的成绩. 如果成绩 大于等于90,则输出 优秀 如果成绩 大于等于80,则输出 良好 如果成绩 大于等于70,则输出 一般 如果成绩 大于等于60,则输出 合格 以上条件均不满足,则输出 一首凉凉送给你![root@server0 /]# vim /root/if02.sh #!/bin/bashread -p '请输入您的成绩:' numif [ $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
for 循环体系 ,反复执行类似的操作献血人==》采血购票者==》售票for 变量名 in 值列表do 命令done[root@server0 /]# vim /root/for.shfor a in lisi wangwu dc tc do useradd $s echo $a创建成功done[root@server0 ~]# chmod +x /root/for.sh[root@server0 ~]# /root/for.sh
循环的列表值,可以不参与,循环执行的反复操作造数工具:{起侍..结束} {1..10}:[root@server0 ~]# echo {1..10}1 2 3 4 5 6 7 8 9 10[root@server0 ~]# vim /root/qw.sh#!/bin/bashfor a in {1..10}do echo hahadone[root@server0 ~]# bash qw.shhaha haha haha haha haha haha haha haha haha haha[root@server0 ~]# vim /root/foo.sh #!/bin/bash if [ $# -eq 0 ];then #判断用户是否输入参数 echo '/root/foo.sh redhat|fedora' >&2 #变成错误输出 exit 1 #程序退出返回值为1 elif [ $1 == redhat ];then echo fedora elif [ $1 == fedora ];then echo redhat else echo '/root/foo.sh redhat|fedora' >&2 #变成错误输出 exit 2 #程序退出返回值为2 fi
在虚拟机server:搭建Web服务 1.安装httpd(Apache)软件包(服务端软件)[root@server0 ~]# yum -y install httpd 2.重起httpd服务[root@server0 ~]# systemctl restart httpd[root@server0 ~]# systemctl enable httpd3.书写一个页面文件默认网页文件的名字:index.html[root@server0 ~]# vim /var/www/html/index.html
转载地址:http://urnwi.baihongyu.com/