Linux
基础知识
01搭建Centos7系统
02软件管理仓库
03Shell
04查看帮助命令
05系统工作命令
06系统状态检测命令
07工作目录切换命令
08文本文件编辑命令
09文件目录管理
10打包压缩与搜索命令
11输入输出重定向
12管道符与通配符
13Vim编辑器
14Shell脚本
15shell流程控制语句
16用户管理操作
17文件权限与归属
18文件隐藏属性
19文件访问控制列表
20su与sudo
21存储结构
22物理设备命名规则
23文件系统
24挂载硬件设备
25虚拟机添加硬盘设备
26系统中操作添加硬盘设备
27添加交换分区
28磁盘容器配额
29软硬方式链接
30RAID
31LVM
32程序安装与管理
33计划任务
34日志文件分析
35测试网络联通性
36FTP服务
37操作系统基本符号
38操作系统三剑客
39shell基础
40shell语法
41DNS
42Apache概述
43Nginx概述
44集群概述
Vmware安装Ubuntu
更换源
-
+
首页
40shell语法
# shell语法 ## if语句 ```txt if 如果 then 那么 ``` **单分支举例** 检测目录cdrom是否存在,若不存在则创建 ```shell # vim a.sh #!/bin/bash MOUNT_DIR="/media/cdrom/" if [ -z $MOUNT_DIR ] then mkdir -p $MOUNT_DIR echo "目录'${MOUNT_DIR}'已创建成功!" fi ``` ```shell # vim fdisk.sh #!/bin/bash if [ $USER != root ] then echo "当前用户为${USER},该用户不是超级管理员,无法执行该命令!" exit 1 #//当命令执行到此处时,将不再执行接下来的命令。如,将该值删除后,无论用户是不是root都将会执行fi之后的命令 fi echo -e "\e[5;32m 该系统磁盘情况如下:\e[0m" fdisk -l ``` **双分支举例** ```txt if 如果 then 那么 else 否则 ``` 检测ping的对象是否能够连通,并反馈结果 ```shell # vim b.sh #!/bin/bash ping -c 1 -i 0.2 -W 3 $1 &> /dev/null # -c包的个数,i测试时间间隔 W延迟3秒等待应答 if [ $? -eq 0 ] then echo "Host $1 is up!" else echo "Host $1 is down!" fi # bash b.sh 192.168.1.151 Host 192.168.1.151 is up! #!/bin/bash ping -c 4 $1 &> /dev/null if [ $? -eq 0 ];then echo "主机$1连接成功!" else echo "主机$1无法连接!" fi ``` ```shell #!/bin/bash Name=user1 if id $Name &> /dev/null;then echo "user1存在,ID信息为:`id $Name`" else echo "user1不存在,正在建立该用户..." useradd $Name echo 123456 | passwd --stdin $Name &> /dev/null fi 给一个用户,判断该用户是管理员还是普通用户: #!/bin/bash A=`id -u $1` if [ $A -eq 0 ] &> /dev/null;then echo "当前用户$1 的UID为:$A,为系统管理员!" else echo "当前用户$1 的UID为:$A,为普通用户!" fi ``` 升级版本: ```shell #!/bin/bash id $1 &>/dev/null if [ $? -eq 0 ];then A=`id -u $1` if [ $A -eq 0 ];then echo "当前用户$1 的UID为:$A,为系统管理员!" else echo "当前用户$1 的UID为:$A,为普通用户!" fi else echo "你输入的用户名不存在!" fi ``` **多分支举例** ```shell # vim d.sh #!/bin/bash read -p "请输入您的分数(0-100):" GRADE if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] then echo "$GRADE 分!优秀" elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] then echo "$GRADE 分,合格" else echo "$GRADE 分?不合格" fi #!/bin/bash read -p "请输入数字,0-5范围内:" A if [ $A -eq 0 ] then echo "你输入的数字是$A!" elif [ $A -eq 1 ] then echo "你输入的数字是$A!" elif [ $A -eq 2 ] then echo "你输入的数字是$A!" elif [ $A -eq 3 ] then echo "你输入的数字是$A!" elif [ $A -eq 4 ] then echo "你输入的数字是$A!" elif [ $A -eq 5 ] then echo "你输入的数字是$A!" else echo "你输入的数字不在规定范围内!" fi ``` ```shell #!/bin/bash read -p "请输入你要查询的分数(0-100):" A 90 if [ $A -ge 80 ] then echo "你的成绩为${A}分,很不错,你很优秀!" elif [ $A -ge 60 ] && [ $A -lt 80 ] then echo "你的成绩为${A}分,你的成绩及格,请继续努力!" elif [ $A -ge 40 ] && [ $A -lt 60 ] then echo "你的成绩为${A}分,你的成绩未及格,再稍微努力你就合格了!" else echo "你的成绩为${A}分,你上课是在开飞机吗?考那么点。" fi ``` 通过stty可以实现让用户在输入值时隐藏输入内容 ```shell #!/bin/bash stty -echo read -p "请输入你的密码:" password #echo $password stty echo //在使用stty -echo 后一定要结束使用stty,否则无法正常显示再次输入的内容。 # read -s -p "输入密码:" ABC 也可实现以上功能 read -n 8 abc //-n表示设置用户输入字符的数量,达到该值自动提交 举例: #!/bin/bash echo "输入密码:" stty -echo read -n 8 password stty echo # read -s -t 2 var //-t 限制时间内输入内容,默认单位为秒 # read -d "#" var //以特定字符结尾,如打10086要求输入身份证并以#号结尾 aaaaa#[root@pillarx1m ~]# ``` ## for for 循环 自动创建多个已定义的用户名及相同的密码: ```shell # vim a.txt a b c d e # vim a.sh #/bin/bash ABC=`cat /root/a.txt` for name in $ABC do useradd $name echo "redhat" | passwd --stdin $name done ``` 根据已定义的用户列表创建相关用户及与用户名相同的密码: ```shell #!/bin/bash B=`cat /root/user.txt` NULL="/dev/null" for A in $B do useradd $A &> $NULL echo "$A" | passwd --stdin $A &> $NULL done ``` 根据列出的主机IP,判断这些主机是否能够通信: ```shell # vim ipadds.txt 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4 192.168.1.5 192.168.1.6 192.168.1.7 192.168.1.8 192.168.1.9 192.168.1.10 # vim chkhosts.sh #!/bin/bash HLIST=$(cat /root/ipadds.txt) for IP in $HLIST do ping -c 3 -i 0.2 -W 3 $IP &> /dev/null if [ $? -eq 0 ] ; then echo "Host $IP is up." else echo "Host $IP is down." fi done -c //发送包个数 -i //每个包发送间隔,单位为秒 -W //等待数据包回应时间,网络延迟低时可以设置为1,网络延迟高可设置高些。 ``` ## while while循环 ```shell # vim uaddwhile.sh #!/bin/bash PREFIX="satu" Uid=1 //定义自增量 while [ $Uid -le 20 ] do useradd ${PREFIX}$Uid echo "123456" | passwd --stdin ${PREFIX}$Uid &> /dev/null # let Uid++ done let Uid++ //表示在Uid的基础上+1,以实现递增功能 let Uid+=10 //增加 let Uid-=1 //减 ``` 创建用户时编号以10位递增: ```shell #!/bin/bash PREFIX="aaa" Uid=10 while [ $Uid -le 100 ] do useradd ${PREFIX}$Uid echo "123456" | passwd --stdin ${PREFIX}$Uid &> /dev/null let Uid+=10 done ``` ```shell # $RANDOM 在每次调用的时候,返回一个不同的随机整数 # 指定的范围是: 0 - 32767 # echo ${RANDOM:0:2} //表示取随机数,但是该数从0开始且只有2位数,":2"为值的位数,最高5位数 如果我们想要产生0-25范围内的数,如何做呢?如下: # echo $(expr $RANDOM % 26) 用这个环境变量对26取模,就可以得到最小是0,最大是25的数了。 如果想得到1--68范围内的数,可以这样 # echo $(expr $RANDOM % 68 + 1) 前面可以得到最小为0,最大为67的随机数,再加上1,很自然的就可以得到最大为1,最小为68的数了。 如果想得到6--87范围内的数。可以这样 # echo $(expr $RANDOM % 82 + 6) 前面可以得到最小为0,最大为81的随机数,再加上6,很自然的就可以得到最大为87,最小为6的数了。 ``` ```shell # vim guess.sh #!/bin/bash PRICE=$(expr $RANDOM % 1000) TIMES=0 echo "商品实际价格为0-999之间,猜猜看是多少?" while true do read -p "请输入你猜测的价格数目:" INT let TIMES++ if [ $INT -eq $PRICE ] ; then echo "恭喜你答对了, 实际价格是 $PRICE" echo "你总共猜测了 $TIMES 次" exit 0 elif [ $INT -gt $PRICE ] ; then echo "太高了!" else echo "太低了!" fi done ``` ## case 1、case语句和if条件语句的适用性。 case语句比较适合变量值较少且为固定的数字或字符串集合的情况,如果变量的值是已知固定的start/stop/restart等元素,那么采用case语句来实现就比较适合。 2、case语句和if条件语句的常见应用场景 case主要是写服务的启动脚本。if就是取值判断、比较,应用面比case更广。几乎所有的case语句都可以用if条件语句来实现。 3、case语句的特点及优势 case语句就相当于多分支的if/elif/else语句,但是case语句的优势是更规范、易读。 **示例:** 当变量的值等于值1时,执行指令1;等于值2时执行指令2,以此类推;如果都不符合,则执行"*)"后面的指令。 判断用户键入的字符类型: ```shell # cat hitkey.sh #!/bin/bash read -p "请输入一个字符,并按Enter键确认:" KEY case "$KEY" in [a-z]|[A-Z]) echo "您输入的是 字母。" ;; [0-9]) echo "您输入的是 数字。" ;; *) echo "您输入的是 空格、功能键或其他控制字符。" esac ``` 编写服务控制脚本 ```shell #!/bin/bash # chkconfig: - 85 15 case "$1" in start) /usr/sbin/apachectl start echo "正在启动服务:httpd,-----服务启动成功!" ;; stop) /usr/sbin/apachectl stop echo "正在停止服务:httpd,-----服务停止成功!" ;; *) echo $"请参照以下规则输入: {start|stop}" esac ```
毛林
2025年9月12日 20:50
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码