Linux|shell编程|实验总结|期末考查试题

1.编写一个Linux的shell编程,计算输入两个年份之间的闰年之和。

#!/bin/bash

# 获取用户输入的两个年份
echo "请输入两个年份,用空格隔开:"
read year1 year2

# 检查输入的年份是否有效
if [[ ! $year1 =~ ^[0-9]+$ ]] || [[ ! $year2 =~ ^[0-9]+$ ]]; then
    echo "输入的年份格式不正确"
    exit 1
fi

if (( year1 > year2 )); then
    echo "第一个年份必须小于第二个年份"
    exit 1
fi

# 计算闰年之和
sum=0
for((year=$year1; year<=$year2; year++)); do
    if (( year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) )); then
        (( sum++ ))
    fi
done

# 输出闰年之和
echo "从 $year1 年到 $year2 年之间的闰年之和是 $sum"

2.编写一个linux编程,要求用*号打印一个倒梯形。

#!/bin/bash

# 获取倒梯形的行数
echo "请输入倒梯形的高度:"
read height

# 创建一个与高度相同的二维数组
stars=( )
for ((i=0; i<height; i++)); do
  stars[$i]=""
done

# 在二维数组中填充星号
for ((i=0; i<height; i++)); do
  for ((j=0; j<height-i; j++)); do
    stars[$i]+="*"
  done
done

# 打印二维数组
for ((i=0; i<height; i++)); do
  echo ${stars[$i]}
done

3.编写一个linux的shell编程,实现列出当前目录里的目录和文件的个数的功能。

#!/bin/bash

# 获取当前目录的路径
current_dir=$(pwd)

# 使用 find 命令列出当前目录下的所有文件和目录
files_and_dirs=$(find "$current_dir" -maxdepth 1 -type f -o -type d)

# 将 find 命令的输出按换行符分割,并保存到数组中
files_and_dirs_array=( $files_and_dirs )

# 将数组的长度作为文件和目录的总数
total_files_and_dirs=${#files_and_dirs_array[@]}

# 分别计算文件和目录的数量
num_files=0
num_dirs=0
for file_or_dir in "${files_and_dirs_array[@]}"; do
  if [ -f "$file_or_dir" ]; then
    ((num_files++))
  elif [ -d "$file_or_dir" ]; then
    ((num_dirs++))
  fi
done

# 打印文件和目录的数量
echo "当前目录 $current_dir 中有 $total_files_and_dirs 个文件和目录,其中包括 $num_files 个文件和 $num_dirs 个目录。"

4.编写一个linux的shell编程,实现打印九九乘法表的功能。

#!/bin/bash

# 打印九九乘法表的标题
echo "九九乘法表:"

# 使用 for 循环遍历 1 到 9
for i in $(seq 1 9); do
  # 使用嵌套的 for 循环遍历 1 到 9
  for j in $(seq 1 9); do
    # 计算 i 和 j 的乘积
    product=$((i * j))

    # 格式化输出,确保每列的宽度相同
    printf "%2d x %-2d = %-3d  " $i $j $product
  done

  # 换行
  echo
done

5.编写一个linux的shell编程,实现在当前目录中添加test1,test2, test3文件,并把这三个文件分别剪切到dir1,dir2,dir3目录中去。

#!/bin/bash

# 创建test1、test2和test3文件
touch test1 test2 test3

# 创建dir1、dir2和dir3目录
mkdir dir1 dir2 dir3

# 将test1文件剪切到dir1目录
mv test1 dir1

# 将test2文件剪切到dir2目录
mv test2 dir2

# 将test3文件剪切到dir3目录
mv test3 dir3

6.编写一个linux的shell编程,制作一个计算器,能进行加减乘除运算。

#!/bin/bash

# 获取用户输入的两个数字和运算符
echo "请输入第一个数字:"
read num1

echo "请输入第二个数字:"
read num2

echo "请输入运算符(+、-、*、/):"
read operator

# 根据运算符进行计算
case $operator in
  "+")
    result=$((num1 + num2))
    ;;
  "-")
    result=$((num1 - num2))
    ;;
  "*")
    result=$((num1 * num2))
    ;;
  "/")
    if [ $num2 -eq 0 ]; then
      echo "除数不能为0"
    else
      result=$((num1 / num2))
    fi
    ;;
  *)
    echo "无效的运算符"
    ;;
esac

# 打印计算结果
if [ -n "$result" ]; then
  echo "计算结果为:$result"
fi

7.编写一个linux的shell编程,计算100以内的质数和。

#!/bin/bash

# 初始化质数和的变量
sum=0

# 遍历100以内的数字
for ((i=2; i<=100; i++)); do
  # 假设i是质数
  is_prime=1

  # 从2到i的平方根遍历
  for ((j=2; j<=$(echo "sqrt($i)" | bc); j++)); do
    # 如果i被j整除,则i不是质数
    if (( i % j == 0 )); then
      is_prime=0
      break
    fi
  done

  # 如果i是质数,则将i添加到质数和中
  if (( is_prime == 1 )); then
    sum=$((sum + i))
  fi
done

# 打印质数和
echo "100以内的质数和为:$sum"

8.编写linux的shell编程,把100以内能被3整除但不能被5整除的数列出来,3个一行。

#!/bin/bash

# Initialize a counter
i=1

# Iterate until i is greater than 100
while [ $i -le 100 ]
do
    # Check if i is divisible by 3 and not divisible by 5
    if [ $((i % 3)) -eq 0 ] && [ $((i % 5)) -ne 0 ]
    then
        # Print i, followed by a space character
        printf "%3d " $i

        # Increment the counter by 3
        ((i += 3))

        # Check if the counter is greater than 100
        if [ $i -gt 100 ]
        then
            # Print a newline character to terminate the line
            echo
        fi
    else
        # Increment the counter by 1
        ((i += 1))
    fi
done

9.编写linux的shell编程,制作一个电话本,要有添加,删除,查询,修改,退出功能。

#!/bin/bash

# 定义电话本数据结构
declare -A phonebook

# 定义主菜单函数
function main_menu() {
  echo "-----------------------------------------"
  echo "电话本"
  echo "-----------------------------------------"
  echo "1. 添加联系人"
  echo "2. 删除联系人"
  echo "3. 查询联系人"
  echo "4. 修改联系人"
  echo "5. 退出"
  echo "-----------------------------------------"
  echo "请选择一个选项:"
}

# 定义添加联系人函数
function add_contact() {
  echo "请输入联系人姓名:"
  read name
  echo "请输入联系人电话号码:"
  read phone_number
  phonebook[$name]=$phone_number
  echo "联系人已添加。"
}

# 定义删除联系人函数
function delete_contact() {
  echo "请输入要删除的联系人姓名:"
  read name
  if [ -z "${phonebook[$name]}" ]; then
    echo "联系人不存在。"
  else
    unset phonebook[$name]
    echo "联系人已删除。"
  fi
}

# 定义查询联系人函数
function query_contact() {
  echo "请输入要查询的联系人姓名:"
  read name
  if [ -z "${phonebook[$name]}" ]; then
    echo "联系人不存在。"
  else
    echo "联系人电话号码:${phonebook[$name]}"
  fi
}

# 定义修改联系人函数
function modify_contact() {
  echo "请输入要修改的联系人姓名:"
  read name
  if [ -z "${phonebook[$name]}" ]; then
    echo "联系人不存在。"
  else
    echo "请输入新的联系人电话号码:"
    read new_phone_number
    phonebook[$name]=$new_phone_number
    echo "联系人已修改。"
  fi
}

# 主循环
while true; do
  main_menu
  read choice
  case $choice in
    1)
      add_contact
      ;;
    2)
      delete_contact
      ;;
    3)
      query_contact
      ;;
    4)
      modify_contact
      ;;
    5)
      echo "退出电话本。"
      exit 0
      ;;
    *)
      echo "无效的选项。"
      ;;
  esac
done

10.编写linux的shell编程,制作一个石头,剪刀,布的游戏。

#!/bin/bash

# 定义游戏手势
declare -a gestures=("石头" "剪刀" "布")

# 定义游戏规则
declare -A rules=(
  ["石头"]["剪刀"]="石头赢"
  ["石头"]["布"]="布赢"
  ["剪刀"]["石头"]="石头赢"
  ["剪刀"]["布"]="剪刀赢"
  ["布"]["石头"]="布赢"
  ["布"]["剪刀"]="剪刀赢"
)

# 获取玩家手势
function get_player_gesture() {
  echo "请输入您的手势(石头、剪刀或布):"
  read player_gesture
  while [[ ! "${gestures[@]}" =~ "$player_gesture" ]]; do
    echo "无效的手势,请重新输入:"
    read player_gesture
  done
}

# 获取电脑手势
function get_computer_gesture() {
  computer_gesture=${gestures[$RANDOM % 3]}
}

# 判断胜负
function judge_winner() {
  if [[ $player_gesture == $computer_gesture ]]; then
    echo "平局"
  elif [[ ${rules[$player_gesture][$computer_gesture]} == "$player_gesture赢" ]]; then
    echo "玩家赢"
  else
    echo "电脑赢"
  fi
}

# 打印结果
function print_result() {
  echo "玩家手势:$player_gesture"
  echo "电脑手势:$computer_gesture"
  echo "胜负结果:$(judge_winner)"
}

# 主循环
while true; do
  get_player_gesture
  get_computer_gesture
  print_result
  echo "是否继续游戏(y/n)?"
  read continue_game
  if [[ $continue_game != "y" ]]; then
    break
  fi
done

11.编写linux的shell编程,打印一个五角星

#!/bin/bash
#打印五角星
echo   "输出五角星图案"
for (( i1=1;i1<6;i1++ )) #这是五角星的上面一个角
do
 let c=19-$i1
 for ((  j1=1;$j1<$c;j1++ ))  #这是空格
   do
echo  -n " "
   done
let d=2*$i1-1
for (( k1=1;$k1<=$d;k1++ ))  #这是“*”
   do
echo -n "*"
done
echo
 done


for (( i2=1;i2<5;i2++ )) #这是五角星的中间两个角
  do
let e=3*$i2-3
 for  (( j2=1;$j2<$e;j2++ ))
   do
echo -n " "
done
let f=42-6*$i2
for (( k2=1;$k2<=$f;k2++ ))
   do
echo -n "*" 
done
echo
  done

for (( i3=1;i3<3;i3++ ))  #这是中间与下部相接的部分
  do
let g=12-$i3
 for (( j3=1;j3<$g;j3++ ))
   do
echo  -n " "
 done
 let h=12+2*$i3
for (( k3=1;k3<=$h;k3++ ))
   do
echo -n "*" 
  done
echo
   done



for (( i4=1;i4<5;i4++ ))  #这是五角星的下面两个角
   do
let o=10-$i4
 for (( j4=1;j4<$o;j4++ ))
   do
echo  -n " "
    done
let p=10-2*$i4
for (( k4=1;k4<=$p;k4++ ))
  do
echo -n  "*" 
   done
let q=6*$i4-3
for (( m4=1;m4<$q;m4++ ))
   do
echo -n " " 
  done
for (( n4=1;n4<=$p;n4++ ))
  do
echo  -n  "*"
done
echo
done




echo "    *                        *" #盖上角

12.编写一个shell编程,制作一个猜数字游戏。

#!/bin/bash

# 生成随机数
random_number=$((RANDOM % 100 + 1))

# 获取用户猜测的数字
echo "请输入您猜测的数字:"
read guess

# 判断用户猜测的数字是否正确
while [[ $guess != $random_number ]]; do
  if [[ $guess -lt $random_number ]]; then
    echo "您的猜测太小了,请重新猜测:"
  else
    echo "您的猜测太大了,请重新猜测:"
  fi
  read guess
done

# 告诉用户猜对了
echo "恭喜您,您猜对了!"

13.编写linux的shell编程,打印一个10以内的加法表。

#!/bin/bash

# 打印加法表的标题
echo "10以内的加法表:"

# 使用 for 循环遍历 1 到 10
for ((i=1; i<=10; i++)); do
  # 使用嵌套的 for 循环遍历 1 到 10
  for ((j=1; j<=10; j++)); do
    # 计算 i 和 j 的和
    sum=$((i + j))

    # 格式化输出,确保每列的宽度相同
    printf "%2d + %-2d = %-3d  " $i $j $sum
  done

  # 换行
  echo
done

14.编写linux的shell编程,打印一个10以内的减法表。

#!/bin/bash

# 打印减法表的标题
echo "10以内的减法表:"

# 使用 for 循环遍历 1 到 10
for ((i=1; i<=10; i++)); do
  # 使用嵌套的 for 循环遍历 1 到 10
  for ((j=1; j<=10; j++)); do
    # 计算 i 和 j 的差
    difference=$((i - j))

    # 格式化输出,确保每列的宽度相同
    printf "%2d - %-2d = %-3d  " $i $j $difference
  done

  # 换行
  echo
done

15.编写linux的shell编程,把输入的数字进行求和。

#!/bin/bash

# 获取用户输入的数字
echo "请输入要求和的数字,用空格分隔:"
read numbers

# 将数字分割成数组
numbers_array=( $numbers )

# 初始化求和结果
sum=0

# 遍历数组中的每个数字并将其添加到求和结果中
for number in "${numbers_array[@]}"; do
  sum=$((sum + number))
done

# 打印求和结果
echo "求和结果为:$sum"

16.编写linux的shell编程,打印一个等腰三角形。

#!/bin/bash

# 获取用户输入的行数
echo "请输入等腰三角形的高度:"
read height

# 打印等腰三角形的每一行
for ((i=1; i<=height; i++)); do
  # 计算当前行的空格数和星号数
  num_spaces=$((height - i))
  num_stars=$((2 * i - 1))

  # 打印空格
  for ((j=1; j<=num_spaces; j++)); do
    echo -n " "
  done

  # 打印星号
  for ((j=1; j<=num_stars; j++)); do
    echo -n "*"
  done

  # 换行
  echo
done

17.编写linux的shell编程,求1-1000中偶数之和。

#!/bin/bash

# 初始化偶数之和
even_sum=0

# 遍历1到1000
for ((i=1; i<=1000; i++)); do
  # 如果i是偶数,则将其添加到偶数之和中
  if (( i % 2 == 0 )); then
    even_sum=$((even_sum + i))
  fi
done

# 打印偶数之和
echo "1-1000中偶数之和为:$even_sum"

18.编写linux的shell编程,要求输入一个数字,输出一个*的菱形。

#!/bin/bash

# 获取用户输入的行数
echo "请输入菱形的高度:"
read height

# 打印菱形的每一行
for ((i=1; i<=height; i++)); do
  # 计算当前行的空格数和星号数
  num_spaces=$((height - i))
  num_stars=$((2 * i - 1))

  # 打印空格
  for ((j=1; j<=num_spaces; j++)); do
    echo -n " "
  done

  # 打印星号
  for ((j=1; j<=num_stars; j++)); do
    echo -n "*"
  done

  # 换行
  echo

  # 打印菱形的下半部分
  for ((i=$((height-1)); i>=1; i--)); do
    # 计算当前行的空格数和星号数
    num_spaces=$((i))
    num_stars=$((2 * i - 1))

    # 打印空格
    for ((j=1; j<=num_spaces; j++)); do
      echo -n " "
    done

    # 打印星号
    for ((j=1; j<=num_stars; j++)); do
      echo -n "*"
    done

    # 换行
    echo
  done

19.编写linux的shell编程,要求输入一个数字,以数字输出一个直角三角形。

#!/bin/bash

# 获取用户输入的行数
echo "请输入直角三角形的高度:"
read height

# 打印直角三角形的每一行
for ((i=1; i<=height; i++)); do
  # 打印i个数字
  for ((j=1; j<=i; j++)); do
    echo -n "$j"
  done

  # 换行
  echo
done

20.编写linux的shell编程,输入一个年份,判断是不是闰年。

#!/bin/bash

# 获取用户输入的年份
echo "请输入年份:"
read year

# 判断年份是否能被4整除
if (( year % 4 == 0 )); then
  # 判断年份是否能被100整除
  if (( year % 100 == 0 )); then
    # 判断年份是否能被400整除
    if (( year % 400 == 0 )); then
      echo "$year是闰年。"
    else
      echo "$year不是闰年。"
    fi
  else
    echo "$year是闰年。"
  fi
else
  echo "$year不是闰年。"
fi

21.编写一个linux的shell编程,要求输入一个数字n并计算1~n的和,如果输入的数字小于1,则重新输入,直到输入正确的数字为止。

#!/bin/bash

# 循环获取用户输入的数字,直到输入正确的数字
while true; do
  echo "请输入一个数字n:"
  read n

  # 判断n是否大于等于1
  if (( n >= 1 )); then
    break
  else
    echo "输入的数字必须大于等于1,请重新输入。"
  fi
done

# 计算1到n的和
sum=0
for ((i=1; i<=n; i++)); do
  sum=$((sum + i))
done

# 打印1到n的和
echo "1到$n的和为:$sum"

22.编写linux的shell编程,要求批量创建用户user_00,user_01,.....,user_99.

#!/bin/bash

# 定义要创建的用户名的前缀
user_prefix="user_"

# 循环创建用户
for i in $(seq -f "%02g" 0 99); do
  username="${user_prefix}${i}"
  useradd -m $username
done

23.编写linux的shell编程,求1-1000以内的奇数之和。

#!/bin/bash

# 初始化奇数之和
odd_sum=0

# 遍历1到1000
for ((i=1; i<=1000; i++)); do
  # 如果i是奇数,则将其添加到奇数之和中
  if (( i % 2 != 0 )); then
    odd_sum=$((odd_sum + i))
  fi
done

# 打印奇数之和
echo "1-1000以内的奇数之和为:$odd_sum"

兄弟们,花了点时间整理了一下,希望对兄弟有用,提醒一点的是做练习的时候,写代码就别把代码里面的中文全部写进去了,写一点就好。哪里有问题的,还请兄弟们指正!!!

一. 填空题: 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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值