shell的部分习题(持续更新)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell的部分习题(持续更新)相关的知识,希望对你有一定的参考价值。

  1. 写一个脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息

#!/bin/bash
read -p"put your answer(yes or no):" Answer
case $Answer in
y|Y|[yY][eE][sS])                 //判断用户输入yes时的一切可能性
  echo "you agree"
;;
n|N|[nN][oO])                     //判断用户输入no时的一切可能性
  echo "you disagree"
;;
*)
  echo "please input the right answer"
esac

2.写一个脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

#!/bin/bash
read -p"input the path:" Path
if [ ! -e $Path ];then              //[]中-e判断是否存在
  echo "No such file"
  exit
fi
 if [ -f $Path ];then
   echo "$Path is Common file"
 elif [ -d $Path ];then
   echo "$Path is Directory"
 elif [ -l $Path ];then
   echo "$Path is Symbol file"
 else
   echo "Unkown"
fi

3.用*打印一个正三角形

#!/bin/bash
#version 1.0
read -p "please input the linenumber:" Linenumber
for Lineid in `seq 1 $Linenumber`
do
  for A in `seq 1 $[$Linenumber-$Lineid]`        //先打空白,然后再打*
  do
  echo -n " "
  done
  
  for B in `seq 1 $[2*$Lineid-1]`
  do
  echo -n "*"
  done
echo
done

执行效果如下:

技术分享

4.写一个脚本,提示用户输入一个用户名,先判断用户是否存在,如果不存在,则先创建用户,然后再设定密码同用户名

#!/bin/bash
#
#
read -p "input an username:" Username
grep "^$Username\>" /etc/passwd &>/dev/null
if [ $? -eq 0 ];then
  echo -e "the \033[31m$Username\033[0m is exist" //echo -e \033[31m***\033[0m为将***着色
  else
   useradd $Username &>/dev/null
   echo -e "add \033[32m$Username\033[0m successful"
   echo $Username | passwd --stdin $Username &>/dev/null
   id $Username
fi

5.写一个脚本,提示用户输入正整数N的值,计算1+2+3...+n的总和

#!/bin/bash
#
#
Sum=0
read -p "Input the int n: " I
for N in `seq 1 $I`;do           //N取的取值从1一直到用户输入数值I
  if [ $N -le $I ];then
   let Sum+=$N
  fi
done
echo "The sum is $Sum"

6.写一个脚本,计算用户输入几个参数的和

#!/bin/bash
#
#
Sum=0
read -p "Input the int n: " I
for N in $I;do                     //N从用户输入的值中取值,使用方法类似于[email protected]
   let Sum+=$N
done
  echo -n "All the parameter sum is:"
  echo -n "`echo $I | tr " " "+"`"  //将用户输入的参数空白换成+
  echo -e "=\033[5;31m$Sum\033[0m"

7.写一个脚本,提示用户输入几个正整数,然后计算其总乘积,最后例出用户输入的参数,形如:1*3*10=30

#!/bin/bash
#
read -p "input some postive integer: " Integer
Sum=1
for K in $Integer;do
if [ $K -le 0 ];then
echo "you are wrong~"
exit
fi
done
for I in $Integer;do
     Sum=$(($Sum*$I))
done
  echo -n "All the parameter sum is:"
  echo -n "`echo $Integer | tr " " "*"`"
  echo -e "=\033[5;31m$Sum\033[0m"

8.找出100以内所有能被3整除的数,每行显示8个数,然后换行显示

#!/bin/bash
#
#
A=0
for I in {1..100};do
  while [ $(($I%3)) -eq 0 ];do
     echo -ne "$I\t" 
     let I++
     let A++                      //计算满足被3整除的个数
     if [ $(($A%8)) -eq 0 ];then  //被3整除的个数为8的倍数后换行
       echo
     fi
  done
done
echo

9.使用while循环编写脚本,使其完成下面的功能

 1.提示用户输入两个整数:firstNum和secondNum(fistNum的值一定要小于secondNum)

 2.输出所有介于firstNum和secondNum之间的奇数

 3.输出所有介于firstNum和secondNum之间的偶数的和。

#!/bin/bash
#
#
read -p "Input 2 numbers,the first must less equal the second one:" First Second
while [ $First -gt $Second ];do
  echo "The first one must less equal the second one,please input again :)"
  read -p "Input 2 numbers,the first must less equal the second one:" First Second
done
A=$[$First+1]          
B=$[$Second-1]        //将两者的范围缩小,以满足题目中的介于之间要求
Sum=0
echo -n "The odd in the first number and second number is: "
    for I in `seq $A $B`;do
       if [ $[$I%2] -eq 1 -o $[$I%2] -eq -1 ];then  //判断I是否为奇数
	    echo -en "\033[5;32m$I\033[0m "     //正确则输出I值
       else
	    let Sum+=$I         //I值为偶数时则进行累加
	   fi
    done
echo
echo -e "The sum of the even in the first number and second one is:\033[5;31m$Sum\033[0m"

10.只使用while,写一个脚本,提示用户输入一个正整数(如果不是正整数要求用户重新输入),而后输出小于等于该数的所有质数

#!/bin/bash
#
#
read -p "Input the number: " Prime
  while [[ ! "$Prime" =~  ^[[:digit:]]*$  ||  $Prime -le 0 ]];do //判断用户输入为正整数
    read -p "You need put a positive integer: " Prime
  done
I=1
echo -n "The primes in $Prime is: "
while [ $I -le $Prime ];do
    K=1
    N=0
    J=2
    while [ $J -lt $(($I-1)) ];do           //J取值从2开始,取1开始的话后面无法进入循环
       while [ $(($I%$J)) -eq 0 -a $N -eq 0 ];do  //判断I对J取模的结果是否为0
         K=0         //记录一个返回值,不能直接输出I值,避免多次判断多次输出
              N=1         //如果满足条件进入循环,设定一个跳出值
       done
    let J++
    done
    M=0                //同上N值的设定,为跳出循环
    while [ $K -eq 1 -a $M -eq 0 ];do   //判断返回值是否为初始值
    echo -n "$I "            //因为不为质数则进入上述循环,会将返回值变为K=0
    M=1
    done
let I++
done
echo

 注:此处用for和if结合使用时脚本相对会简单,有兴趣的同学可以自行编写


11.计算距离自己生日还有多少天

#!/bin/bash
#
#
read -p "Input your the month of yourbirthday,the format such as 05 :" Birthmonth 
 while [[ ! "$Birthmonth" =~ [0-9][0-9] || $Birthmonth -lt 1 || $Birthmonth -gt 12 ]];do
//判断用户是否输入两位数字,个位数需用零补全
  read -p "Input two digits,the value must between in 01 and 12,such as 04 :" Birthmonth
  done
read -p "Input your the day of your birthday,the format such as 25 : " Birthday
  until [[ $Birthday =~ [0-9][0-9]  && $Birthday -gt 0 && $Birthday -le 31 ]];do
     read -p "Input two digits,and the value must in 01 and 31,such as 25 :" Birthday
  done
Year=`date +%Y`                           //定义变量,简化后续引用
J=`date +%s`
if [ $Birthmonth$Birthday -eq `date +%m%d` ];then     //if判断如果生日与现在时间相等
   echo -e "\033[5;31mToday is your birthday,happy birthday to you.\033[0m"
elif [ $Birthmonth$Birthday -gt `date +%m%d` ];then   //如果生日还未到
   I=`date -d $Year$Birthmonth$Birthday +%s`
   echo -e "\033[5;32m$(((($I-$J))/60/60/24+1))\033[0m days later will be your birthday"
else                                   //else生日已过的情况
   if [ $Birthmonth$Birthday -eq 0229 ];then       //如果生日是2/29号
      case $((`date +%Y`%4)) in               //判断今年是否是闰年
      0)                              //如果今年是闰年
        I=`date -d $(($Year+4))$Birthmonth$Birthday +%s`
echo -e "\033[5;35m$(((($I-$J))/60/60/24+1))\033[0m days later will be your birthday"
;;
      1)       
        I=`date -d $(($Year+3))$Birthmonth$Birthday +%s`
echo -e "\033[5;35m$(((($I-$J))/60/60/24+1))\033[0m days later will be your birthday"
;;
      2)
        I=`date -d $(($Year+2))$Birthmonth$Birthday +%s`
echo -e "\033[5;35m$(((($I-$J))/60/60/24+1))\033[0m days later will be your birthday"
;;
      3) 
        I=`date -d $(($Year+1))$Birthmonth$Birthday +%s`
echo -e "\033[5;35m$(((($I-$J))/60/60/24+1))\033[0m days later will be your birthday"
;;
      esac
    else                                //如果生日不是2/29号    
        I=`date -d $(($Year+1))$Birthmonth$Birthday +%s`
echo -e "\033[5;35m$(((($I-$J))/60/60/24+1))\033[0m days later will be your birthday"
    fi
fi


以上是关于shell的部分习题(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章

回归 | js实用代码片段的封装与总结(持续更新中...)

小程序各种功能代码片段整理---持续更新

500道全网最新python面试习题(大厂面试经典,从此面试不在愁)持续更新中(附源代码)

❤️Spark的关键技术回顾,持续更新!推荐收藏加关注❤️

❤️Spark的关键技术回顾,持续更新!推荐收藏加关注❤️

动态规划习题本(持续更新)