实验五 shell脚本编程
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | Linux系统与应用 |
| 这个作业的要求在哪里 | 作业要求 |
| 学号-姓名 | 17041403-刘杨 |
| 作业学习目标 | 1.了解shell脚本的概念及使用 2.掌握shell脚本语言的基本语法 3.学习简单的shell脚本编程 |

1.让用户输入一个字符串,如果用户输入的是 hello ,请输入 hello 用户姓名首字母缩写 ,否则输出 请输入hello
方法1
#!/bin/bash #此脚本使用/bin/bash来解释执行 #!是一个特殊的表示符,其后跟着解释此脚本的shell路径
read -p '请输入一个字符串:' str #用read命令定义交互式变量str,-p后面跟提示信息,即在输入前打印提示信息
if [ $str = "hello" ] #条件判断
then
echo "hello ly" #echo命令输出字符串
else
echo "请输入hello"
fi #if语句要以fi结束(每一个if都要对应一个fi)


方法2
#!/bin/bash
if [ $1 = "hello" ] #与方法1的区别:没有使用交互式变量而是直接用$1即给shell脚本传的第1个参数与hello比较
then
echo "hello ly"
else
echo "请输入hello"
fi


方法3
#!/bin/bash
read -p '请输入一个字符串:' str
[ "$str"= 'hello' ] && echo "ly" || echo '请输入hello' #此时条件判断用逻辑运算符实现


2.编写一脚本,判断输入用户名是否存在,输出结果只能是存在该用户或者不存在该用户,不能有其 他数据输出。
方法1
#!/bin/bash
read -p '请输入用户名:' user_name #交互式变量user_name
id $user_name &> /dev/null #id命令显示用户user_name的信息,将输出重定向到/dev/null中即不输出结果
if [ $? -eq 0 ] #$?获取最后命令的退出状态,0表示没有错误 eq表示相等
then
echo "存在用户$user_name" #$?为0时表明存在该用户
else
echo "不存在用户$user_name" #$?不为0时表明不存在该用户
fi


方法2
#!/bin/bash
read -p '请输入用户名:' user_name
grep -w $user_name /etc/passwd &> /dev/null #用grep查看输入参数是否在/etc/passwd中-w表示精确查找
if [ $? -eq 0 ]
then
echo "存在用户$user_name"
else
echo "不存在用户$user_name"
fi


3.编写脚本计算1-100之间的所有奇数和
#!/bin/bash
SUM=0 #定义变量SUM存奇数和并赋初值
for i in {1..100..2} #i从1开始,每次循环加2,直到i大于100 ..表连续
do
let SUM=$SUM+$i #奇数相加
done #for/do/done循环结构
echo "1-100之间的所有奇数和为: $SUM" #输出奇数和


4.编写脚本,判断键盘输入整数是否为质数。
#!/bin/bash
read -p '请输入一个正整数:' num #定义交互式变量num
[ $num -eq 1 ] && echo '$num是质数' && exit #若输入为1则输出1为质数并退出程序
[ $num -eq 2 ] && echo '$num是质数' && exit #若输入为2则输出2为质数并退出程序
for i in `seq 2 $[$num-1]` #seq命令生成从2—(num-1)的整数
do
[ $[$num%i] -eq 0 ] && echo "$num不是质数"&&exit #若num可被1和它本身以外的数整除则说明不为质数
done
echo "$num是质数" && exit #否则输出num为质数并退出


5.模拟一个多任务维护界面,当执行程序时先显示总菜单,然后进行选择后做相应的维护监控操作。
#!/bin/bash
cat <<- EOF #获取stdin,并在EOF处结束stdin,输出stdout - 使分界符(EOF)所在行的开头部分的制表符(Tab)被去除。即输入完成后,在一个新的一行输入EOF结束stdin的输入时,EOF不必顶行写
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
EOF
while true
do
read -p "请选择需要操作的内容(help h):" action #变量action用于选择功能
case $action in
h) #caes语句格式
cat <<- EOF
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
EOF
;; #caes语句格式
f)
lsblk #显示磁盘分区,也可用 fdisk -l
;;
d)
df -h #显示磁盘挂载
;;
m)
free -m #查看内存使用
;;
u)
uptime #查看系统负载
;;
q)
exit #退出程序
;;
esac #case in /esac结构用于多分支选择
done #while/do/done循环结构









6.编写脚本实现计算用户输入参数数字的和,分别用 shift 和 for 循环实现。
#!/bin/bash
SUM=0 #定义变量SUM存和并初始化为0
while [ $# -ne 0 ] # $#为传递到脚本的参数个数 -ne为不等于
do
let SUM=$SUM+$1 #当传递到脚本的参数个数不为0时SUM+第1位参数值
shift #将位置参数左移,默认移1位
done #while/do/done循环结构
echo SUM=$SUM #输出最后和


#!/bin/bash
SUM=0 #定义变量SUM存和并初始化为0
for i
do
let SUM=$SUM+$i #for循环将所有参数相加求和
done
echo SUM=$SUM


7.编写脚本,生成一个phonenumber.txt文件,文件内容为随机产生以139开头的手机号1000个, 每个手机号占一行。
#!/bin/bash
file=./phonenumber.txt #建立文本文件phonenumber存储手机号
for(( i=1; i<=1000; i++ )) #循环1000次产生1000个手机号
do
n1=$[ $RANDOM%10 ] #用RANDOM函数产生0-9的随机数字
n2=$[ $RANDOM%10 ] #产生n~m范围内的随机数使用$RANDOM取余m-n+1,之后加上n
n3=$[ $RANDOM%10 ]
n4=$[ $RANDOM%10 ]
n5=$[ $RANDOM%10 ]
n6=$[ $RANDOM%10 ]
n7=$[ $RANDOM%10 ]
n8=$[ $RANDOM%10 ]
echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> $file #输出以139开头的11位手机号给./phoneenumber文件
done


8.在第7题产生的1000个电话号码中抽取5位幸运号码,并显示,要求只显示前3三位数字和后4位数 字,中间四位用*代替。
#!/bin/bash
phone=./phonenumber.txt #把phonenumber.txt文件地址给phone
for (( i=1; i<=5; i++)) #5次循环取5个号码
do
line=`wc -l $phone | cut -d ' ' -f1` #wc -l为统计文件行数(0开始数)-d用来定义分隔符,此时为空格 -f1表示取第1个字段 本行命令目的是只显示行数
luck_line=$[ $RANDOM%$line+1] #随机选中1个幸运行号
luck_number=`head -$luck_line $phone | tail -1` #取幸运行号对应号码作为幸运号码并返回最后一行
echo "139****${luck_number:7:4}" #7为幸运号码的第7位(0开始数) 4为往后再数4位 输出的是139****+幸运号码第8-11位数
echo $luck_number >> luck.txt #将幸运号码写入luck.txt文件中
sed -i "/$luck_number/d" $phone #将phonenumber.txt文件中已被抽取的幸运号码删除
done


9.使用 until 语句批量创建10个用户,要求 stu1-stu5 用户的 UID 分别为 2001-2005 , stu6stu10 用户的家目录分别在 /rhome/stu6-/rhome/stu10
#!/bin/bash
if [ -d /rhome ] #判断rhome目录是否已存在,若存在则为真
then
echo "/rhome 已经存在"
else
mkdir /rhome #不存在则新建rhome目录
echo "/rhome 不存在,创建成功"
fi
i=1 #定义循环变量i并赋值为1
until [ $i -gt 5 ] #i大于5则跳出循环,即对stu1-stu5操作
do
useradd -u $[2000+$i] stu$i && echo "stu$i:123" | chpasswd #useradd命令用来建立用户帐号和 创建用户的起始目录(使用权限是超级用户) -u指定UID chpasswd命令对用户名为stu1-stu5设置密码123
let i++
done
until [ $i -gt 10 ] #i大于10则跳出循环,即对stu6-stu10操作
do
useradd -d /rhome/stu$i stu$i && echo "stu$i:123" | chpasswd #-d指定用户登入时的主目录,对用户名为stu6-stu10设置密码123
let i++
done



10.编写脚本收集用户输入的基本信息(姓名,性别,年龄),如果用户不输入一直提示用户输入, 后根据用户输入的信息输出相应的内容。
#!/bin/bash
input_fun(){
input_var=" " #定义输入变量input_var为空
output_var=$1 #定义输出变量output_var为第1个参数值
while [ -z $input_var ] #-z判断变量的值是否为空(为空时一直循环)
do
read -p "$output_var" input_var #提示输入 input_var为交互式变量
done
echo $input_var #函数调用时分别将输入值input_var给name sex age
}
name=`input_fun 请输入你的姓名:` #调用函数input_fun,用户输入姓名进行传参
sex=`input_fun 请输入你的性别:` #调用函数input_fun,用户输入性别进行传参
age=`input_fun 请输入你的年龄:` #调用函数input_fun,用户输入年龄进行传参
echo "你的姓名是 $name" #输出姓名
echo "你的性别是 $sex" #输出性别
echo "你的年龄是 $age" #输出年龄



浙公网安备 33010602011771号