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

目录

[shell 的变量](#shell 的变量)

系统变量

特殊变量

运算符

[if 选择结构 ---then 独立一行](#if 选择结构 ---then 独立一行)

[case 语句 等值判断](#case 语句 等值判断)

[上机练习 10](#上机练习 10)

附加题

[for 循环](#for 循环)

[while 循环](#while 循环)

乘法表(双层嵌套)

[上机练习 11](#上机练习 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

bash 复制代码
# 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

附加题

bash 复制代码
#制作一个猜拳游戏
# 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" ]
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

bash 复制代码
# 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}个素数"

把附加题代码修改为循环形式

bash 复制代码
# 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 脚本语法规则真的古怪,琢磨死人了!!!

相关推荐
lldhsds9 分钟前
书生大模型实战营第四期-入门岛-1. Linux前置基础
linux
cuisidong199725 分钟前
5G学习笔记三之物理层、数据链路层、RRC层协议
笔记·学习·5g
Acrelhuang26 分钟前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
wowocpp32 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
南宫理的日知录32 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
皓74134 分钟前
服饰电商行业知识管理的创新实践与知识中台的重要性
大数据·人工智能·科技·数据分析·零售
Mephisto.java36 分钟前
【大数据学习 | kafka高级部分】kafka的kraft集群
大数据·sql·oracle·kafka·json·hbase
Mephisto.java38 分钟前
【大数据学习 | kafka高级部分】kafka的文件存储原理
大数据·sql·oracle·kafka·json
山河君44 分钟前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别
鹏大师运维1 小时前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos