• C高级 脚本相关练习


    练习1:第一个shell脚本

    1. #!/bin/bash
    2. # #!---->shebang
    3. # 指明脚本运行使用的shell解析器
    4. #这是一行注释
    5. echo "第一个shell脚本"

    练习2:定义一个数组,使用外部参数给数组赋值,通过数组求外部参数的个数

    1. 定义一个数组,使用外部参数给数组赋值,通过数组求外部参数的个数
    2. 把家目录的下的所有文件名放到数组中,并记录家目录下文件的个数
    1. #!/bin/bash
    2. arr=($*) #把所有的外部参数赋值给数组arr
    3. echo ${#arr[*]}
    4. arr2=(`ls ~`) #把家目录的所有文件名赋值给数组arr1
    5. echo ${#arr2[*]}
    6. echo ${arr2[@]}

    练习3:尝试把read除了-a以外的参数结合起来使用

    1. #!/bin/bash
    2. #read -p "请输入一个变量" var
    3. #read -n 3 var
    4. #read -t 3 var
    5. #read -a arr
    6. read -sp "请输入一个变量" -n 3 -t 4 var
    7. #echo ${#arr[*]}
    8. echo $var

    练习4:终端输入两个三位数,将其中一个自增,把两个变量赋值给第二个变量相加并输出

    1. #!/bin/bash
    2. read -p "请输入两个变量" var1 var2 #如果同一行获取两个变量,变量中间放空格
    3. ((var1++)) #自增
    4. ((var2=var1+var2))
    5. echo $var1
    6. echo $var2
    7. ((var1=var1**3)) #对var1进行幂运算
    8. echo $var1

    练习5:求root用户的uid和ubuntu/linux用户gid相加的结果,比较这两个数的大小关系

    1. #!/bin/bash
    2. num1=`id -u root`
    3. num2=`id -g`
    4. echo $((num1+num2))
    5. #比较num1和num2的大小关系
    6. echo $((num1
    7. #比较num1和num2的大小关系
    8. echo $((num1

    练习6:计算当前目录下文件个数和家目录下文件个数的总和、计算家目录下.c和.sh文件的和

    1. #!/bin/bash
    2. arr=(`ls`)
    3. arr1=(`ls ~`)
    4. brr=(`ls` `ls ~`) #把两个路径下的文件,放到同一个数组中
    5. crr=(${arr[*]} ${arr1[*]}) #先把两个路径下的文件分别存在不同数组中,再拼接两个数组
    6. num1=${#arr[*]}
    7. num2=${#arr1[*]}
    8. echo $[num1+num2]
    9. echo ${#brr[*]}
    10. echo ${#crr[*]}
    11. arr3=(`ls ~/*.c`)
    12. arr4=(`ls ~/*.sh`)
    13. #对前两行的数组计数
    14. num3=${#arr3[*]}
    15. num4=${#arr4[*]}
    16. echo $[num3+num4]

    练习7:终端读入两个数据,使用expr比较大小关系、

    计算/etc/group中,第20行组用户gid和第10行组用户gid的和

    1. #!/bin/bash
    2. read -p "请输入两个变量" var1 var2
    3. expr $var1 \>= $var2
    4. #获取/etc/group中第20行用户的gid
    5. num1=`head -20 /etc/group | tail -1 | cut -d : -f 3`
    6. #获取/etc/group中第10行用户的gid
    7. num2=$(head -10 /etc/group | tail -1 | cut -d : -f 3)
    8. expr $num1 + $num2

    练习8:终端输入网址,如:www.hqyj.com,要求:接触网址每个部分,并放入数组中,不能使用cut,使用expr解决

    1. #!/bin/bash
    2. read -p "请输入一个网址" net
    3. len=`expr length $net` #网址的长度
    4. #找第一个.的位置
    5. pos1=`expr index $net .`
    6. #截取第一个.前面的所有子串
    7. arr[0]=`expr substr $net 1 $((pos1-1))`
    8. #为了找第二个.需要把后面的所有子串都截取出来
    9. str2=`expr substr $net $((pos1+1)) $len`
    10. #找到第二个.的位置
    11. pos2=`expr index $str2 .`
    12. arr[1]=`expr substr $str2 1 $((pos2-1))`
    13. arr[2]=`expr substr $str2 $((pos2+1)) $len`
    14. echo ${arr[*]}

    练习9:创建一个文件,给组用户可读权限,所属用户可写权限,其他用户可执行权限,使用if判断文件有哪些权限

    1. #!/bin/bash
    2. touch 1
    3. chmod 241 1
    4. if [ -r 1 ]
    5. then
    6. echo "文件1有可读权限"
    7. fi
    8. if [ -w 1 ]
    9. then
    10. echo "文件1有可写权限"
    11. fi
    12. if [ -x 1 ]
    13. then
    14. echo "文件1有可可执行权限"
    15. fi

    练习10:终端输入年份,判断闰平年(四年一闰,百年不闰,四百年再闰)

    1. #!/bin/bash
    2. read -p "请输入一个年份" year
    3. #对年份的判断
    4. #year对4\100和400取余都是算术运算,需要借助于(())\$[]\let\expr
    5. #test指令内不能使用&&和||进行运算,test提供了-a进行逻辑与,-o进行逻辑或
    6. if [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]
    7. #if [ $((year%4)) -eq 0 ] && [ $((year%100)) -ne 0 ] || [ $((year%400)) -eq 0 ]
    8. #if [ $((year%4==0&&year%100!=0||year%400==0)) -eq 1 ]
    9. then
    10. echo "$year是一个闰年"
    11. else
    12. echo "$year不是一个闰年"
    13. fi

    练习11:终端输入一个.sh文件名,判断文件是否存在,如果存在判断文件是否有可执行权限,如果有执行脚本,如果没有添加可执行权限,如果文件不存在,创建脚本文件

    1. #!/bin/bash
    2. read -p "请输入.sh文件" var
    3. if [ -e "$var" ]
    4. then
    5. echo "文件存在"
    6. if [ -x "$var" ]
    7. then
    8. bash $var
    9. else
    10. chmod 777 $var
    11. fi
    12. else
    13. echo"文件不存在"
    14. touch $var
    15. fi

    练习12:终端输入一个.c文件名,判断文件中是否有内容,如果有内容编译该文件,如果没有内容删除文件

    1. #!/bin/bash
    2. read -p "请输入一个.c文件" filename
    3. if [ -s $filename ] #判断文件是否存在且有内容
    4. then
    5. gcc $filename
    6. else
    7. if [ -e $filename ] #如果文件存在
    8. then
    9. rm $filename
    10. echo "$filename已删除"
    11. else
    12. echo "$filename不存在"
    13. fi
    14. fi

    练习13:终端输入两个文件名,判断文件的时间戳哪一个更新

    1. #!/bin/bash
    2. read -p "请输入两个文件名" filename1 filename2
    3. if [ $filename1 -nt $filename2 ]
    4. #如果条件成立,-nt参数表示前面文件的时间戳更新
    5. then
    6. echo "$filename1更新"
    7. else
    8. echo "$filename2更新"
    9. fi

    练习14:终端输入学生成绩,判断等级100-90A,90-80B,80-70C,70-60D,其他不及格

    1. #!/bin/bash
    2. read -p "请输入成绩" score
    3. ret=$((score/10))
    4. : 'case $score in
    5. 1??|9?)
    6. echo "A"
    7. ;;
    8. 8?)
    9. echo "B"
    10. ;;
    11. 7?)
    12. echo "C"
    13. ;;
    14. 6?)
    15. echo "D"
    16. ;;
    17. *)
    18. echo "不及格"
    19. esac'
    20. case $ret in
    21. 10|9)
    22. echo "A"
    23. ;;
    24. 8)
    25. echo B
    26. ;;
    27. 7)
    28. echo C
    29. ;;
    30. 6)
    31. echo D
    32. ;;
    33. *)
    34. echo "不及格"
    35. esac

    练习15:终端输入一个字符,判断是字母还是数字字符

    1. read -p "请输入一个字符" var
    2. case $var in
    3. [0-9])
    4. echo "是一个数字"
    5. ;;
    6. [A-Z]|[a-z])
    7. echo "是一个字母"
    8. ;;
    9. *)
    10. echo 不是数字也不是字母
    11. esac

    练习16:求1-100的和,5050

    1. #!/bin/bash
    2. i=1
    3. sum=0
    4. while [ $i -le 100 ] # le 第一个数小于等于第二个数
    5. do
    6. ((sum += $i))
    7. ((i++))
    8. done
    9. echo $sum

    练习17:终端输入数组,使用while循环,实现数组中元素的求和

    1. #!/bin/bash
    2. read -p "请输入数组" -a arr
    3. i=0
    4. sum=0
    5. while [ $i -lt ${#arr[*]} ]
    6. do
    7. ((sum += ${arr[i]}))
    8. ((i++))
    9. done
    10. echo $sum

    练习18:终端输入行数,打印直角三角形

    1. #!/bin/bash
    2. read -p "请输入行数" line
    3. i=1
    4. j=1
    5. while [ $i -le $line ]
    6. do
    7. j=1 #每一次进入内层循环前j都从1开始
    8. while [ $j -le $i ]
    9. do
    10. echo -n "*"
    11. ((j++))
    12. done
    13. echo "" #每行输出结束需要换行
    14. ((i++))
    15. done

    练习19:求100-1000内的水仙花数

    1. #!/bin/bash
    2. #for i in `seq 100 999`
    3. for i in {100..999} #{1..3}展开1-3内的每一个数
    4. do
    5. x=$((i%10)) #求个位
    6. y=$((i/10%10)) #求十位
    7. z=$((i/100)) #求百位
    8. if [ $((x**3+y**3+z**3)) -eq $i ]
    9. then
    10. echo $i是一个水仙花数
    11. fi
    12. done

    练习20:终端输入行数,打印直角三角形

    1. #!/bin/bash
    2. read -p "请输入行数" line
    3. i=1
    4. j=1
    5. while [ $i -le $line ]
    6. do
    7. j=1
    8. while [ $j -le $i ]
    9. do
    10. echo -n "*"
    11. ((j++))
    12. done
    13. echo -e "\n"
    14. ((i++))
    15. done

    练习21:定义一个稀疏数组,求数组中元素的和

    1. arr=([0]=12 [5]=78 [7]=23)
    2. sum=0
    3. for j in ${arr[*]}
    4. do
    5. ((sum+=j))
    6. done
    7. echo $sum

    练习22:求家目录下目录文件和普通文件个数的和

    1. #!/bin/bash
    2. fnum=0
    3. dnum=0
    4. for i in `ls ~`
    5. do
    6. if [ -d ~/$i ]
    7. then
    8. ((dnum++))
    9. fi
    10. if [ -f ~/$i ]
    11. then
    12. ((fnum++))
    13. fi
    14. done
    15. echo $((dnum+fnum))
    16. #!/bin/bash
    17. #var1和var2都是软连接文件
    18. var1=2
    19. var2=test1
    20. #对软连接文件判断是,实际是在判断源文件
    21. if [ -f $var1 ]
    22. then
    23. echo "$var1是一个普通文件"
    24. fi
    25. if [ -d $var2 ]
    26. then
    27. echo "$var2是一个目录文件"
    28. fi

    练习23:终端输入一个游戏名,让用户选择是否下载,如果用户选择的是Y|YES|y|yes就下载该游戏,N|NO|n|no就不下载该游戏

    1. #!/bin/bash
    2. read -p "请输入游戏名" gname
    3. select i in Y YES y yes N NO n NO
    4. do
    5. case $i in
    6. Y|YES|y|yes)
    7. echo "下载$gname"
    8. ;;
    9. N|NO|n|no)
    10. echo "不下载$gname"
    11. exit
    12. esac
    13. done

  • 相关阅读:
    408考研科目《数据结构》第八章第一节:排序的基本概念和插入排序(直接插入排序,折半插入排序,希尔排序)
    JS中字符串常用方法(总结)
    lodash已死?radash库方法介绍及源码解析 —— 对象方法篇
    web前端期末大作业 基于HTML+CSS+JavaScript程序员个人博客模板(web学生作业源码)
    画画用电容笔还是触控笔?电容笔10大品牌排行榜
    数据可视化系列教程|六大组件基础知识
    C++ 类
    HTML emoji整理 表情符号
    06【Redis事务与分布式锁】
    按钮控制LED灯、蜂鸣器、风扇实验
  • 原文地址:https://blog.csdn.net/Smallxu_/article/details/132817360