一、实验内容:
先创建用户家目录下创建文件名为“姓名+学号+02”的子目录,作为本次实验目录,本次实验的所有代码都放到该目录下。要求将所有源代码与数据文件打包成文件lab2.tar.gz,与实验报告一起提交。
预备任务(可不保存该任务源代码,但后面的任务要将源代码打包保存):查看命令类型 type的验证
//type [option] command
//-t 显示命令类型
其中 file :外部命令 alias: 别名 builtin:内部命令
//-p显示完整的路径
//-a显示所有匹配命令
[s2@centos8 ~]$ type ls
ls 是 `ls --color=auto’ 的别名
[s2@centos8 ~]$ type -t ls
alias
[s2@centos8 ~]$ type -t cd
builtin
[s2@centos8 ~]$ type -t date
file
任务1:将某用户最近使用过的20条命令行保存到一个文件中,并用vi编辑,删除命令行前的序号。
history|tail -20<<f1.txt
vim f1.txt
esc->ctrl+v->j->xx
删除第一列 在命令模式下ctrl+v 按下j(连续按下) 按下xx 可删除某一列
任务2. 验证如下脚本功能(理解每条语句注释,及脚本功能描述):
username=$1 //将第一个位置参数赋值给username
[ -z $username]&&read -p “Please Input Username:” username
//如果username长度为0那么 重新输入 username
w -h|grep -q “^$username”|| { echo $username do not login;exit 1;}
//w 命令用于显示已经登录系统的用户列表 -h 不打印头信息
// 检查用户是否登录 若没有登录 输出echo $username do not login;exit 1;
echo -n InputMessage to Send: // echo -n 不输出行尾的换行符
//输出Input Message to Send:
read msg //键盘输入msg
if echo$msg|write $username 2>/dev/null
// 2> 标准输出错误
//将msg 的值赋给(发送给)username 将错误信息输入/dev/null
then echo Send Message successfully!!
//若成功,就输出Send Messagesuccessfully!!
else echo Send Message fail!!
//否则 输出Send Message fail!!
Fi
//结束
任务3. 验证:编写脚本统计指定目录中普通文件的个数、目录的个数、链接文件的个数。
#! /bin/bash
//定义变量分别统计文件个数
a=0
b=0
c=0
//for循环
for s in ls *
do
[ -L “$s” ] && let c=c+1
[ -f ”$s“ ] && let a=a+1
[ -d “$s” ] && let b=b+1
done
echo 普通文件:
a
目录文件:
a 目录文件:
a目录文件:b 链接文件: $c
任务4:验证:编写一个脚本名称为backup.sh,将第二个位置参数及其以后各参数所指定目录中的以.c和.sh结尾的,且文件大小不为0的文件复制到第一个位置参数所指定的目录中。(注:要求检查位置参数的合法性)
#! /bin/bash
[ $# -lt 2 ]&&{
echo 参数不够
exit 1
}
a=$3;//第二个位置
b=$2;//第一个位置
[ -d $b ]||{
echo 目录不存在
}
for s in $b/*.c
b
/
∗
.
s
h
d
o
[
−
s
"
b/*.sh do [ -s "
b/∗.shdo[−s"s" ]&& cp $s $a
done
//代码测试
//将根目录下 以.c .sh 结尾的文件复制到 dir3目录下
[s2@centos8 ~]$ ./backup.sh dir3 ~
[s2@centos8 ~]$ ls dir3
backup.sh dir31 f1.sh feb.c hello.c tongji.sh
任务5: 编写Shell脚本实现如下菜单界面:
Menu
- exit
- edit file
- date
- calc
#?
任务6:编写Shell脚本,实现批量添加用户功能,要求如下:
1)用户名格式统一,为相同字符串加数字编号,如qwe1-qwe9
2)用户密码与用户名相同
任务7:编程提示用户输入两个单词,并将其读入,然后比较这两个单词,如果两个单词相同则显示“Match”,并显示“End of program”,如果不同则显示“End of program” (先用 vi 或 cat>命令建立脚本)
二、具体步骤
1.创建文件名为“姓名+学号+02”的子目录,代码及结果如下:
mkdir ~/姓名+学号+02
2.将某用户最近使用过的20条命令行保存到一个文件中,并用vi编辑,删除命令行前的序号,代码及结果如下:
history | tail -20 > ~/姓名+学号+02/f1.txt
vi ~/姓名+学号+02/f1.txt
在命令模式下按下ctrl+v
按下j(连续按下多次)
再按下xx
3. 验证如下脚本功能,首先先创建脚本shell1,在终端输入vim shell1.sh
在弹出的页面输入代码并退出(按i进入插入模式,退出按esc,输入“:wq”)
运行shell文件,在终端输入sh shell1.sh
输入用户名及发送的内容即可
具体代码及运行结果如下(Linux的注释是以#开头,不是//):
username=$1
# 如果没有输入用户名,则重新输入
[ -z $username ] && read -p "Please Input Username: " username
# 检查用户是否登录
w -h | grep -q "^$username" || {
echo "$username do not login"
exit 1
}
# 输出提示信息并读入数据
echo -n "Input Message to Send: "
read msg
# 发送信息
if echo $msg | write $username 2>/dev/null; then
echo "Send Message successfully!!"
else
echo "Send Message fail!!"
fi
4. 验证:编写脚本统计指定目录中普通文件的个数、目录的个数、链接文件的个数。
首先先创建脚本shell2,在终端输入vim shell2.sh
在弹出的页面输入代码并退出(按i进入插入模式,退出按esc,输入“:wq”)
运行shell文件,在终端输入sh shell2.sh
具体代码及运行结果如下(Linux的注释是以#开头,不是//):
#!/bin/bash
# 定义变量分别统计文件个数
a=0
b=0
c=0
# for循环
for s in ls *
do
[ -L "$s" ] && let c=c+1
[ -f "$s" ] && let a=a+1
[ -d "$s" ] && let b=b+1
done
echo "普通文件:$a 目录文件:$b 链接文件:$c"
5. 验证:编写一个脚本名称为backup.sh,将第二个位置参数及其以后各参数所指定目录中的以.c和.sh结尾的,且文件大小不为0的文件复制到第一个位置参数所指定的目录中。(注:要求检查位置参数的合法性)
首先先创建脚本backup.sh,在终端输入vim backup.sh
在弹出的页面输入代码并退出(按i进入插入模式,退出按esc,输入“:wq”)(原文件提供的代码有误,例如变量顺序是1,2不是2,3、cp指令的源文件夹和目标文件夹顺序、变量却少双引号等)
运行shell文件,在终端输入./backup.sh ~ dir3
(dir3为自己在文件夹根目录新创建的文件夹)
具体修改后代码及运行结果如下(Linux的注释是以#开头,不是//):
#! /bin/bash
[ $# -lt 2 ]&&{
echo 参数不够
exit 1
}
a=$2
b=$1
[ -d $b ]||{
echo 目录不存在
}
for s in $b/*.c $b/*.sh
do
[ -s "$s" ]&& cp "$s" "$a/"
done
6.编写Shell脚本实现如下菜单界面:
Menu
- exit
- edit file
- date
- calc
#?
首先先创建脚本shell3,在终端输入vim shell3.sh
在弹出的页面输入代码并退出(按i进入插入模式,退出按esc,输入“:wq”)
运行shell文件,在终端输入sh shell3.sh
#!/bin/bash
while true; do
echo "Menu"
echo "1) exit"
echo "2) edit file"
echo "3) date"
echo "4) calc"
echo "#?"
read choice
case $choice in
1)
exit
;;
2)
echo -n "Please input filename: "
read filename
vi $filename
;;
3)
date
;;
4)
echo -n "Please input expression: "
read exp
echo "scale=2;$exp" | bc
;;
*)
echo "Invalid choice"
;;
esac
done
7. 编写Shell脚本,实现批量添加用户功能,要求如下:
1)用户名格式统一,为相同字符串加数字编号,如qwe1-qwe9
2)用户密码与用户名相同
首先先创建脚本shell4,在终端输入vim shell4.sh
在弹出的页面输入代码并退出(按i进入插入模式,退出按esc,输入“:wq”)
创建账户需要权限,进入root,在终端输入su root,输入密码
运行shell文件,在终端输入sh shell4.sh
在账户设置可以看到用户成功创建
#!/bin/bash
for i in {1..9}
do
username=qwe$i
password=$username
useradd -m -p $(openssl passwd -1 $password) $username
done
8. 编程提示用户输入两个单词,并将其读入,然后比较这两个单词,如果两个单词相同则显示“Match”,并显示“End of program”,如果不同则显示“End of program” (先用 vi 或 cat>命令建立脚本)
首先先创建脚本shell5,在终端输入vim shell5.sh
在弹出的页面输入代码并退出(按i进入插入模式,退出按esc,输入“:wq”)
运行shell文件,在终端输入sh shell5.sh
具体代码及运行结果如下(Linux的注释是以#开头,不是//):
#!/bin/bash
echo -n "Please input the first word: "
read word1
echo -n "Please input the second word: "
read word2
if [ "$word1" = "$word2" ]; then
echo "Match"
fi
echo "End of program"
9.最后打包,在终端输入tar -czvf lab2.tar.gz backup.sh shell1.sh shell2.sh shell3.sh shell4.sh shell5.sh,找到压缩包