学习大数据DAY24 Shell脚本的书写

avatar
作者
猴君
阅读量:0

目录

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 == "" ] thenecho "去逛街" 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 "不要作弊" # fi

for 循环

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" ] doecho "学习做作业考试" 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 脚本语法规则真的古怪,琢磨死人了!!!

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!