Linux期末复习编程题

0.先说说编程需要注意的点吧

  1. 如果是if 条件时,需要注意每个字符都要用空格隔开,比如if [ $a = $b ] # 注意需要空格隔开
  2. 如果是赋值语句,就不需要用空格隔开,比如result=$[a+b] # 注意等号两边不能有空格

1.if条件语句

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

实例

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

2.乘法口诀表

#!/bin/bash							#这行必须加
for((i=1;i<=9;i++))					#表示i从1到9
do
    for((j=1;j<=i;j++))				#表示j从1到i
    do
        echo -n "$j*$i=$[$i*$j]  "  #注意后面两个空格还有一个-n选项
    done
    echo ""
done

3.自动删除50个账号

#!/bin/bash
i=1													# i从1开始
while [ $i -le 50 ]									# $i小于等于50的话继续执行循环
do
    if [ -n "`cat /etc/passwd | grep user$i`" ]		# 这句就是现在/etc/passwd中查找
    												# 有没有存在user$i,这里的$i是1到
    												# 50,例如passwd里面有user20,则当
    												# $i为20的时候 
    												# cat /etc/passwd | grep user20
    												# 会找到对应的一行内容,这个时候字符
    												# 串的长度不为0,所以-n选项会判断为true
    												# 则执行then语句
    then
        sudo userdel -r user${i}					# 接着以user20为例子,则删除user20这个用户
        											# 当前用户若是root则不需要写sudo这个命令
        echo "success delete user$i"				# 输出"成功删除user20"
    else	
        echo "not found user$i"						# 当我们没查找到对应的user时
        											# 输出"不存在user+编号"
    fi
    i=$[$i+1]										# i需要进行+1操作,注意是"i="而不是"$i="
done

因为上面不太美观,于是看下面:

#!/bin/bash
i=1
while [ $i -le 50 ]
do
    if [ -n "`cat /etc/passwd | grep user$i`" ]
    then
        sudo userdel -r user${i}
        echo "success delete user$i"
    else
        echo "not found user$i"
    fi
    i=$[$i+1]
done

4.菜单设计

这题也需要根据题目需求来写,只能给定大概的模板!具体看题意如何说明。

#!/bin/bash
echo "Welcome to my soft system!"	# 这句话没什么卵用,就是写着玩
while true							# 让程序进入死循环
do
    echo "1. option1"				# 这4句就是菜单
    echo "2. option2"
    echo "3. option3"
    echo "0. exit"
    
    read option						# 读取键盘的输入并存入到option变量中
    								# 因为我们这里数字都是1个字符,所以可以使用-n1选项

    if [ $option -eq 0 ]			# 如果变量option的值是0,则使用break语句推出循环
    then
        break
    fi

    case $option in					# case条件分支语句,贼好用,这里是用来判断option的值
    1)								# 如果option值为1
        echo "exec option1"			# 执行"操作1",这里的操作根据题目要求定义
        ;;							# 类似于c语言中case的break语句,加就是了,下面几句类似
    2)
        echo "exec option2"
        ;;
    3)
        echo "exec option3"
        ;;
    *)								# 这一句类似于c语言的case中的default,默认选项
        echo "unknow option!"		# 由于没有准确定义默认操作是什么,所以可以随便输出点什么东西
        ;;
    esac
    # clear							# 这个是清屏用的,可以每次都清一次屏幕,不然很乱
done

上面这是模板,现在我们来一个实例:

  1. 代表cd命令
  2. 代表pwd命令
  3. 代表touch命令
  4. 代表rm命令
  5. 代表ls命令
#!/bin/bash
curDir=`pwd`					# 获取当前路径
while true						# 死循环
do
    echo "1. cd command"		# 命令说明
    echo "2. pwd command"
    echo "3. touch command"
    echo "4. rm command"
    echo "5. ls command"
    echo "0. exit"

    read option					# 键入操作
    if [ $option -eq 0 ]		# 如果操作值为0,则退出
    then
        break
    fi

    case $option in				# case分支语句
    1)
        read -e -p "input dir:" dir		# 提示需要输入一个目录名
        cd $dir							# 尝试进入目录
        if [ $? -eq 0 ]					# $?代表获取shell执行后的代码,0是成功,1是失败
        then							# 成功则需要判断一系列操作
            if [ ${dir:0:1} == "/" ]	
            then
                curDir=$dir
            else
                curDir=${curDir}"/"${dir}
            fi
            echo "success in $dir"
        else							# 否则失败
            echo "not found $dir"
        fi
        ;;
    2)
        echo $curDir					# 操作2是输出当前目录
        ;;
    3)
        read -p "input filename:" filename	# 操作3创建文件,需要一个文件名
        sudo touch ${curDir}"/"${filename}	# 创建文件操作
        if [ $? -eq 0 ]						# 如果成功,则$?为0
        then
            echo "success $filename"		# 输出成功
        else
            echo "error $filename"			# 输出失败
        fi
        ;;
    4)
        read -e -p "input remove filename:" filename	# 操作4是删除文件,需要输入一个文件名
        												# 这里使用-e选项代表可以使用tab键补全
        sudo rm -r ${curDir}"/"${filename}				# 删除文件操作
        if [ $? -eq 0 ]									# 成功,$?为0
        then
            echo "success $filename"
        else
            echo "error $filename"
        fi
        ;;
    5)
        ls $curDir										# 操作5输出当前目录的路径
        ;;
    *)
        echo "error code"
        ;;
    esac

done
一. 填空题: 1. 在Linux系统中,以 文件 方式访问设备 。 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。 3. Linux文件系统中每个文件用 i节点 来标识。 .... 82. 增加一个用户的命令是:adduser 或useradd 。 83 进行字符串查找,使用grep命令。 84. 使用 * 每次匹配若干个字符。 85. /sbin 目录用来存放系统管理员使用的管理程序。 二.单项选择题: 1. 下面的网络协议中,面向连接的的协议是: A 。 A 传输控制协议 B 用户数据报协议 C 网际协议 D 网际控制报文协议 2. 在/etc/fstab文件中指定的文件系统加载参数中, D 参数一般用于CD-ROM等移动设备。 ... 113.不是shell具有的功能和特点的是 C 。 A 管道 B 输入输出重定向 C 执行后台进程 D 处理程序命令 114.下列对shell变量FRUIT操作,正确的是: C 。 A 为变量赋值:$FRUIT=apple B 显示变量的值:fruit=apple C 显示变量的值:echo $FRUIT D 判断变量是否有值:[ -f “$FRUIT” ] 三.简答题: 1.简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程。 参考答案: Linux通过i节点表将文件的逻辑结构和物理结构进行转换。 i节点是一个64字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息。在i节点表中最重要的内容是磁盘地址表。在磁盘地址表中有13个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。Linux文件系统通过把i节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相........ root@xxx:#crontab prgx;在每日早晨8:00之前开机后即可自动启动crontab。 6.设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。Shell程序fileback存放在/usr/bin目录下。 参考答案: (1)编写shell程序fileback: #!/bin/sh DIRNAME=`ls /root | grep bak` if [ -z "$DIRNAME" ] ; then mkdir /root/bak cd /root/bak fi YY=`date +%y` MM=`date +%m` DD=`date +%d` BACKETC=$YY$MM$DD_etc.tar.gz tar zcvf $BACKETC /etc echo "fileback finished!" (2)编写任务定时器: echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron crontab /root/etcbakcron 或使用crontab -e 命令添加定时任务: 0 1 * * * /bin/sh /usr/bin/fileback 7.有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做? 参考答案:(1)第一种方法: 用户应使用crontab –e 命令创建crontab文件。格式如下: 0 0 * * sun cp –r /user/backup /tmp (2)第二种方法: 用户先在自己目录下新建文件file,文件内容如下: 0 * * sun cp –r /user/backup /tmp 然后执行 crontab file 使生效。 8.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。 参考答案: 建立程序 Pro16如下: #!/bin/sh i=1 while [ i -le 50 ] do if [ -d /userdata ];then mkdir -p /userdata/user$i chmod 754 /userdata/user$i echo "user$i" let "i = i + 1" (或i=$(($i+1)) else mkdir /userdata mkdir -p /userdata/user$i chmod 754 /userdata/user$i echo "user$i" let "i = i + 1" (或i=$(($i+1)) fi done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值