目录
shell 的变量
系统变量
特殊变量
运算符
if 选择结构 ---then 独立一行
case 语句 等值判断
上机练习 10
附加题
for 循环
while 循环
乘法表(双层嵌套)
上机练习 11
把附加题代码修改为循环形式
shell 的变量
系统变量
 $HOME : 当前登录用户的  " 家目录 "  路径  
 
 $USER :当前用户名  
 
 $RANDOM  可以随机生成  0~32767  之间的整数数字  
 
 自定义变量  
 
 变量名 = 值;常量: readonly  
 
 xm=" 你好 "  
 
 echo " 姓名: $xm"  
 
 echo ' 姓名: $xm'  
 
 readonly p=3.14  
 
 n=`cat /etc/passwd | grep -c "root"`  
 
 echo $n  
 
特殊变量
 1. $n n  为  number , $0  代表该脚本名称, $1-$9  代表第一到第九个参数  
 
 2. $#  获取所有输入参数的个数,常用于循环;  
 
 3. $@  代表命令行中所有的参数, $@ 会把每个参数区分对待;  
 
 4. $?  返回最后一次命令执行的状态,返回  0  代表正确执行,返回非  0  代表执行  
 
 不正确。  
 
 read  读取终端输入  
 
 -p :指定读取值时的提示符;  
 
 -t :指定读取值时等待的时间(秒)。  
 
 read -p " 请输入密码: " s  
 
 read -p " 请输入密码: " -t 10 mima  
 
运算符
 赋值运算符  =  
 
 算数运算符  + - * / %  
 
 比较运算符  
 
 字符串比较:  == !=  
 
 数值比较: -eq  等于  -ne  不等于  -lt  小于  -le  小于等于  -gt  大于  -ge  大于等于  
 
 类型权限: -f  存在且是文件  -d  存在且是目录 -r  读  (read) -w  写 (write) -x  执行  
 
 (execute)  
 
 逻辑运算符  -a -o !  
 
 算数运算符  
 
 1. $(( 运算式 ))  或  $[ 运算式 ] 2. + , - , *, /, %  加,减,乘,除,取余  
 
 echo 3 + 4  
 
 n1=3  
 
 n2=4  
 
 echo $((($n1+$n2*3)/2%2))  
 
 a=10  
 
 b=20  
 
 val=`expr $a + $b`  
 
 echo "a + b : $val"  
 
 let c=($a + $b)  
 
 echo $c  
 
if 选择结构 ---then 独立一行
 if [  条件判断  ]  
 
 then  
 
 程序  
 
 elif [  条件判断  ]  
 
 then  
 
 程序  
 
 else  
 
 程序  
 
 fi  
 
case 语句 等值判断
 case $ 变量名  in  
 
 "value 1" )  
 
 如果变量的值等于  value 1 ,则执行程序  1  
 
 ;; 
 
 "value 2" )  
 
 如果变量的值等于  value 2 ,则执行程序  2  
 
 ;; 
 
 … 省略其他分支 …  
 
 * )  
 
 如果变量的值都不是以上的值,则执行此处程序  
 
 ;;  
 
 esac  
 
 # if  结构  
 
 sex=" 男 "  
 
 if [ $sex == " 男 " ]  
 
 then  
 
 echo " 去做饭 "  
 
 elif [ $sex == " 女 " ]  
 
 then echo " 去逛街 "  
 
 else  
 
 echo " 其他 "  
 
 fi  
 
 # case  结构  
 
 sex=" 男 "  
 
 case $sex in  
 
 " 男 ")  
 
 echo "1"  
 
 ;; 
 
 " 女 ")  
 
 echo "2"  
 
 ;;  
 
 *)  
 
 echo "3"  
 
 ;;  
 
 esac  
 
 #  多条件应用  
 
 a=3  
 
 b=4  
 
 c="s"  
 
 if [ $a -lt $b -a $c == "s" ]  
 
 then  
 
 echo "true"  
 
 else  
 
 echo "false"  
 
 fi  
 
 #  判断文件是否存在  
 
 if [ -f /root/a.txt ]  
 
 then  
 
 echo " 是 "  
 
 cat /root/a.txt  
 
 else  
 
 echo " 不是 "  
 
 fi  
 
上机练习 10
# 1. 编写脚本,将系统日志文件(/var/log/messages),拷贝到/root/文件夹中
# cp /var/log/messages /root/
# 2. 编写脚本,通过位置参数传入学生的姓名和班级,打印“我的名字叫 xx,我
的班级是
# xx 班”# sname="ShiHaiHong"
# class="60"
# echo "我的名字叫${sname},我的班级是${class}班"
# 3. 用 if,写一个 shell 脚本,运行时输入一个数字,如果是 666 则输出 evil,
如果是 777 则
# 输出 lucky, 如果是其他则输出 human。
# read -p "输入一个数字:" number
# if [ $number == 666 ]
# then
# echo "evil"
# elif [ $number -eq 777 ]
# then
# echo "lucky"
# else echo "human"
# fi
# 4. 用 case 方法改写上面的功能。
# read -p "输入一个数字:" number
# case $number in
# "666")
# echo "evil"
# ;;
# "777")
# echo "lucky"
# ;;
# *)
# echo "human"
# ;;
# esac
# 5. 判断/root/hosts 是否是存在并且是普通文件,如果不存在则新建一个,如果
已经存
# 在,则追加写入当前时间到此文件中
# if [ -f /root/hosts.txt ]
# then
# date>>/root/hosts.txt
# else
# touch /root/hosts.txt
# fi
# 6. 判断当前用户是否为 root,如果不是则打印非 root 账号,是的话就执行
ifconfig 查看
# 网卡信息($USER 获取当前用户)
# if [ $USER == "root" ]
# then
# ifconfig
# else# echo $USER
# fi
# 7. 编写脚本判断 mysql 是否正常启动(端口号 3306,查看端口 netstat -nltp,然
后 grep 过
# 滤返回行数,判断行数是否大于 0)
# if [ $(netstat -nltp | grep -c "3306") -gt 0 ]
# then
# echo "mysql 已正常启动"
# else
# echo "mysql 还未开启"
# fi
# 8. 位置参数传递一个绝对路径的文件,添加所有人可执行权限且提示添加执行
权限成
# 功,如果没有传递参数提示没有传递文件,如果传递的文件不存在则先创建再
赋权。
# read -p "填写一个文件" dir
# if [ $# -eq 0 ]
# then
#
echo "没有传递文件"
# fi
# if [ -f $dir ]
# then
#
echo "确实有这个文件,正在赋权"
#
chmod a+x $dir
# else
#
echo "文件不存在,自行创建"
#
touch $dir
#
chmod a+x $dir
# fi
# 9. 首先显示当天日期, 然后查找给定的用户是否在系统中工作(cat
/etc/passwd)。
# 如果在系统中,就输出一条欢迎语句(例如 hello,root!);如果不在系统中,
就
# 输出一条语句(waiting for root!)
# date
# read -p "用户名称:" suser
# if [ $(cat /etc/passwd | grep "$suser" | wc -l) -gt 0 ]
# then
# echo "hello,root!"
# else
# echo "waiting for root!"
# fi
# 10. 接受一个参数,若给定参数不是目录, 则给出提示信息;# 否则使用 ls -l 命令列出该目录下的内容,并输出有多少个子目录(d 开头),
多少
# 个普通文件(-开头)。显示示例如下:
# 目录的数量:16
# 文件的数量:25
# read -p "输入参数" dir
# if [ -d $dir ]
# then
# ls -l $dir
# echo "目录的数量:$(ls -l $dir|grep -c "^d")"
# echo "文件的数量:$(ls -l $dir|grep -c "^-")"
# else
# echo "这不是目录"
# fi附加题
#制作一个猜拳游戏
# read -p "请出拳(石头,剪刀,布):" hand
# if [ $hand == "石头" -o $hand == "剪刀" -o $hand == "布" ]
# then
# echo "玩家:$hand"
# echo -n "电脑:"
#
if [ $RANDOM -ge 0 -a $RANDOM -le 11000 ]
#
then
#
computer="剪刀"
#
elif [ $RANDOM -ge 11001 -a $RANDOM -le 22000 ]
#
then
#
computer="石头"
#
elif [ $RANDOM -ge 22001 -a $RANDOM -le 32767 ]
#
then
#
computer="布"
#
fi
#
echo $computer
#
if [ $computer == $hand ]
#
then
#
echo "平局"
#
elif [ $computer == "剪刀" -a $hand == "布" -o $computer == "石头" -a $hand
== "剪刀" -o $computer == "布" -a $hand == "石头" ]
#
then
#
echo "电脑赢"
#
elif [ $computer == "布" -a $hand == "剪刀" -o $computer == "剪刀" -a $hand
== "石头" -o $computer == "石头" -a $hand == "布" ]
#
then
#
echo "玩家赢"#
fi
# else
#
echo "不要作弊"
# fifor 循环
 for i in  集合  
 
 #  序列  
 
 for i in `seq 1 5`  
 
 do  
 
 echo $i  
 
 done  
 
 #  位置参数  
 
 for i in $@  
 
 do  
 
 echo $i  
 
 done  
 
 #  字符串  
 
 s="a b c dd e"  
 
 for i in $s  
 
 do  
 
 echo $i  
 
 done  
 
 #  命令结果  
 
 s=`ls /root` echo $s  
 
 echo $s  
 
 for i in $s  
 
 do  
 
 echo $i  
 
 done  
 
while 循环
 while [  条件判断  ]  
 
 i=1  
 
 while [ $i -le 10 ]  
 
 do  
 
 echo $i  
 
 i=$(($i+1))  
 
 done  
 
 #  不确定循环次数  
 
 read -p " 及格了吗?( y/n ): " answer  
 
 while [ $answer == "n" ]  
 
 do echo " 学习做作业考试 "  
 
 read -p " 及格了吗?( y/n ): " answer  
 
 done  
 
 echo " 终于及格了 "  
 
乘法表(双层嵌套)
 for i in `seq 1 9`  
 
 do  
 
 for j in `seq 1 $i`  
 
 do  
 
 echo -n " $j * $i = $(($i * $j)) "  
 
 done  
 
 echo ""  
 
 done  
 
 循环控制  
 
 break  等同  plsql  的  exit  
 
 continue  
 
上机练习 11
# 1.鸡兔同笼(同前面 PLSQL 的题目,DAY13)
# for chicken in `seq 0 35`
# do
#
rabbit=$((35 - $chicken))
#
if [ $(($rabbit*4 + $chicken*2)) -eq 94 ]
#
then
#
echo "共有${chicken}只鸡,${rabbit}只兔"
#
fi
# done
# 2.猴子吃桃(同前面 PLSQL 的题目,DAY13)
# pea=1
# for day in `seq 1 10`
# do
#
pea=$((2 * ($pea+1)))
# done
# echo "有${pea}个桃子"
# 3.创建用户组 wanmei,批量建立用户 wm1 到 wm9,用户属于 wanmei 组,创建完
成查
# 看/etc/group 和 /etc/passwd 文件
##groupadd wanmei
# for i in `seq 1 9`
# do
#
useradd -g wanmei "wm$i"
# done#终端查看
#cat /etc/group
#cat /etc/passwd
# 4.删除上面的用户和用户组
# for i in `seq 1 9`
# do
#
userdel "wm$i"
# done
# groupdel wanmei
# 5.实现传入一个目录作为参数,如果传入的不是目录则提示不是目录,如果是
目录则将
# 该目录下所有的普通文件的文件名都罗列出来
# if [ -d $1 ]
# then
# ls -l $1 | grep "^-"
# else
# echo "不是目录"
# fi
# 方法二
# if [ -d $1 ]
# then
#
for i in `ls $1`
#
do
#
if [ -f "$1/$i" ]
#
then
#
echo $i
#
fi
#
done
# else
# echo "不是目录"
# fi
# 6.猜数字游戏:电脑随机产生一个 100 以内的数字(1-99),通过每次键盘输
入来猜数
# 字,输入的小了就提示往大猜,输入大了就提示往小里猜, 直到输入正确数
字(通过
# $RANDOM 获取随机数)
# ComputerNumber=$(($RANDOM % 99 + 1))
# read -p "猜猜看呐" no
# if [ $no -ge 1 -a $no -le 99 ]
# then
#
while [ $no != $ComputerNumber ]
#
do
#
if [ $no -lt $ComputerNumber ]#
then
#
read -p "猜小了,再试一遍吧" no
#
elif [ $no -gt $ComputerNumber ]
#
then
#
read -p "猜大了,再试一遍吧" no
#
elif [ $no -gt 99 -o $no -lt 1 ]
#
then
#
read -p "数字不在范围内啊!" no
#
fi
#
done
#
echo "你终于答对了,恭喜!"
# else
#
echo "不是数字或数字过大!"
# fi
# 7.查看 100 到 200 以内素数并统计素数的个数
# count=0
# for i in `seq 100 200`
# do
#
flag=true
#
for j in `seq 2 $(($i-1))`
#
do
#
if [ $(($i%$j)) -eq 0 ]
#
then
#
flag=false
#
break
#
fi
#
done
#
if [ $flag == true ]
#
then
#
echo $i
#
count=$(($count+1))
#
fi
# done
# echo "有${count}个素数"把附加题代码修改为循环形式
# read -p "来玩猜拳吗?(y/n)" wan
# while [ $wan == 'y' ]
# do
# read -p "请出拳(石头,剪刀,布,我不玩了):" hand
# if [ $hand == "我不玩了" ]
# then
#
break
# elif [ $hand == "石头" -o $hand == "剪刀" -o $hand == "布" ]# then
# echo "玩家:$hand"
# echo -n "电脑:"
#
if [ $RANDOM -ge 0 -a $RANDOM -le 11000 ]
#
then
#
computer="剪刀"
#
elif [ $RANDOM -ge 11001 -a $RANDOM -le 22000 ]
#
then
#
computer="石头"
#
elif [ $RANDOM -ge 22001 -a $RANDOM -le 32767 ]
#
then
#
computer="布"
#
fi
#
echo $computer
#
if [ $computer == $hand ]
#
then
#
echo "平局"
#
elif [ $computer == "剪刀" -a $hand == "布" -o $computer == "石头" -a $hand
== "剪刀" -o $computer == "布" -a $hand == "石头" ]
#
then
#
echo "电脑赢"
#
elif [ $computer == "布" -a $hand == "剪刀" -o $computer == "剪刀" -a $hand
== "石头" -o $computer == "石头" -a $hand == "布" ]
#
then
#
echo "玩家赢"
#
fi
# else
#
echo "不要作弊"
# fi
# done
# echo "下次再会~"需要使用代码请自行消去注释。(ctrl+/)
 吐槽一下,这个  shell  脚本语法规则真的古怪,琢磨死人了!!!