一、作业(练习)内容:
1、描述shell程序的运行原理(可附带必要的图形说明);
2、总结shell编程中所涉及到的所有知识点(如:变量、语法、命令状态等等等,要带图的哟);
3、总结课程所讲的所有循环语句、条件判断的使用方法及其相关示例;(if (jpg|png is not exist);echo ”You say a XX“)
4、总结文本处理工具sed及awk的用法;(必须附带示例)
5、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;(不要怀疑,就是这么简单)
#!/bin/bash #判断某路径是否存在,如果存在,显示其内容类型,否则创建与之同名的目录 #给定路径的方法:脚本参数 if [ $# -lt 1 ];then echo "本脚本是用来判断某路径是否存在,请在脚本后输入至少一个路径" exit 1 fi for i in $*;do if [ -e $i ];then echo "$i已经存在" file $i else mkdir -p $i echo "已成功创建目录$i" echo -e "$(dirname $i)目录下的所有文件和子目录列表为: \n$(ls `dirname $i`)" fi done
6、写一个脚本,完成如下功能:
判断给定的两个数值,孰大孰小;
给定数值的方法:脚本参数,命令交互;(使用read,依然如此简单)
给定数值的方法:脚本参数
#!/bin/bash #判断给定的两个数值大小 #给定数值的方法:脚本参数 [ $# -ne 2 ] && echo "本脚本用来判断给定的两个数值大小,请在脚本后输入两个整数" && exit 0 num1=$(echo $1 | grep ‘^[0-9]\+$‘) num2=$(echo $2 | grep ‘^[0-9]\+$‘) [ -z $num1 ] && [ -z $num2 ] && echo "$1,$2不是整数" && exit 0 [ -z $num1 ] && echo "$1不是整数" && exit 0 [ -z $num2 ] && echo "$2不是整数" && exit 0 [ $1 -eq $2 ] && echo "输入的两个数相同" && exit 0 [ $1 -gt $2 ] && echo "$1大于$2" && exit 0 [ $1 -lt $2 ] && echo "$1小于$2" && exit 0
给定数值的方法:命令交互
#!bin/bash #判断给定的两个数值的大小 #给定数值的方法:命令交互 echo "本脚本用来判断给定的两个数值大小" read -p "请在10秒内输入两个整数: " -t 10 i j [ -z $i ] && [ -z $j ] && echo "请重新输入两个整数" && exit 0 [ -z $j ] && echo "第二个数为空,请输入两个整数" && exit 0 num1=$(echo $i | grep ‘^[0-9]\+$‘) num2=$(echo $j | grep ‘^[0-9]\+$‘) [ -z $num1 ] && [ -z $num2 ] && echo "$i,$j不是整数" && exit 0 [ -z $num1 ] && echo "$i不是整数" && exit 0 [ -z $num2 ] && echo "$j不是整数" && exit 0 [ $i -eq $j ] && echo "输入的两个数相同" && exit 0 [ $i -gt $j ] && echo "$i大于$j" && exit 0 [ $i -lt $j ] && echo "$i小于$j" && exit 0
7、求100以内所有奇数之和(至少用3种方法。是的这是我们的作业^_^)
#!bin/bash #求100以内所有奇数之和 echo "one表示使用第一种方法求得100以内所有奇数之和" echo "two表示使用第二种方法求得100以内所有奇数之和" echo "three表示使用第三种方法求得100以内所有奇数之和" read -p "请在10秒内输入one|two|three中的任意一个单词: " -t 10 val [ -z $val ] && echo "请输入one|two|three中任意一个单词" && exit 0 declare -i sum=0 declare -i j=1 case $val in one) for i in $(seq 1 2 100);do sum=$[$sum+$i] done echo "用for循环步进为2的方法求出100以内所有奇数之和为:$sum" exit 0 ;; two) for ((i=1;i<=100;i++)); do [ $[$i%2] -eq 1 ] && sum=$[$sum+$i] done echo "用for循环取2的模为1的方法求出100以内所有奇数之和为:$sum" exit 0 ;; three) while [ $j -le 100 ];do sum=$[$sum+$j] let j+=2 done echo "用while循环步进为2的方法求出100以内所有奇数之和为:$sum" exit 0 ;; *) echo "输入错误,请选择输入one|two|three中任意一个选项" exit 0 esac
8、写一个脚本实现如下功能:
(1) 传递两个文本文件路径给脚本;
(2) 显示两个文件中空白行数较多的文件及其空白行的个数;
(3) 显示两个文件中总行数较多的文件及其总行数;
#!bin/bash #判断文本文件行数的方法 echo "本脚本用来判断给定的两个文本文件行数" read -p "请在20秒内输入两个文本文件路径:" -t 20 file1 file2 [ -z $file1 ] && [ -z $file2 ] && echo "请输入两个文本文件路径" && exit 0 [ -z $file2 ] && echo "第二个文件路径为空,请输入两个文本文件路径" && exit 0 [ ! -f $file1 ] && [ ! -f $file2 ] && echo "输入的两个文件路径不存在或者不是文本文件,请重新输入" && exit 0 [ ! -f $file1 ] && echo "输入的第一个文件路径不存在或者不是文本文件,请重新输入" && exit 0 [ ! -f $file2 ] && echo "输入的第二个文件路径不存在或者不是文本文件,请重新输入" && exit 0 i=$(grep ‘^$‘ $file1 | wc -l) j=$(grep ‘^$‘ $file2 | wc -l) [ $i -eq $j ] && echo -e "$file1文件和$file2文件的空白行数相同 \n 总共有空白行:$i行" [ $i -gt $j ] && echo -e "空白行数较多的文件是$file1 \n 有空白行:$i行" [ $i -lt $j ] && echo -e "空白行数较多的文件是$file2 \n 有空白行:$j行" k=$(wc -l $file1 | cut -d‘ ‘ -f1) l=$(wc -l $file2 | cut -d‘ ‘ -f1) [ $k -eq $l ] && echo -e "$file1文件和$file2文件总的行数相同 \n 总共有:$k行" [ $k -gt $l ] && echo -e "行数较多的文件是$file1 \n 总共有:$k行" [ $k -lt $l ] && echo -e "行数较多的文件是$file2 \n 总共有:$l行"
9、写一个脚本
(1) 提示用户输入一个字符串;
(2) 判断:
如果输入的是quit,则退出脚本;
否则,则显示其输入的字符串内容;
#!/bin/bash #判用户输入一个字符串 read -p "请在15秒内输入一个字符串:" -t 15 str [ -z $str ] && echo "请输入一个字符串" && exit 0 [[ $str == ‘quit‘ ]] && echo "已退出" && exit 0 || echo "输入的字符串为:$str"
10、写一个脚本,打印2^n表;n等于一个用户输入的值;(不好意思,我调皮了)
#!/bin/bash #打印2^n表;n等于一个用户输入的值 k=1 read -p "请在5秒内输入一个整数:" -t 5 var [ -z $var ] && echo "请输入一个整数" && exit 0 num=$(echo $var | grep "^[0-9]\+$") [ -z $num ] && echo "输入错误,请输入一个整数" && exit 0 for ((i=0;i<=$var;i++));do echo "2^${i}=$k" k=$[${k}*2] done
11、写一个脚本,写这么几个函数:
函数1、实现给定的两个数值的之和;
函数2、取给定两个数值的最大公约数;
函数3、取给定两个数值的最小公倍数;
关于函数的选定、两个数值的大小都将通过交互式输入来提供。
#!/bin /bash #函数1实现给定的两个数值的之和; #函数2、取给定两个数值的最大公约数; #函数3、取给定两个数值的最小公倍数 #;关于函数的选定、两个数值的大小都将通过交互式输入来提供 read -p "请在7秒内输入两个整数:" -t 7 i j [ -z $i ] && [ -z $j ] && echo "请重新输入两个整数" && exit 0 [ -z $j ] && echo "第二个数为空,请输入两个整数" && exit 0 num1=$(echo $i | grep ‘^[0-9]\+$‘) num2=$(echo $j | grep ‘^[0-9]\+$‘) [ -z $num1 ] && [ -z $num2 ] && echo "输入错误,$i,$j不是整数" && exit 0 [ -z $num1 ] && echo "输入错误,$i不是整数" && exit 0 [ -z $num2 ] && echo "输入错误,$j不是整数" && exit 0 sum () { Sum=$[${i}+${j}] echo "输入的两个数之和为:$Sum" } max () { if [ $i -eq $2 ];then echo "输入的两个数的最大公约数为:$i" exit 0 elif [ $i -gt $j ];then for num1 in $(seq $j -1 1);do [ $[$i%$num1] -eq 0 ] && [ $[$j%$num1] -eq 0 ] && echo "输入的两个数的最大公约数为:$num1" && exit 0 done else for num2 in $(seq $i -1 1);do [ $[$i%$num2] -eq 0 ] && [ $[$j%$num2] -eq 0 ] && echo "输入的两个数的最大公约数为:$num2" && exit 0 done fi } min () { if [ $i -eq $j ];then echo "输入的两个数的最小公倍数为:$i" exit 0 elif [ $i -gt $j ];then for num1 in $(seq $i 1 $[$i*$j]);do [ $[$num1%$i] -eq 0 ] && [ $[$num1%$j] -eq 0 ] && echo "输入的两个数的最小公倍数为;$num1" && exit 0 done else for num2 in $(seq $j 1 $[$i*$j]);do [ $[$num2%$i] -eq 0 ] && [ $[$num2%$j] -eq 0 ] && echo "输入的两个数的最小公倍数为;$num2" && exit 0 done fi } echo echo " sum表示求输入的两个数之和" echo " max表示求输入的两个数的最大公约数" echo " min表示求输入的两个数的最小公倍数" read -p "请在10秒内输入sum|max|min中任意一个单词:" -t 10 str [ -z $str ] && echo "请输入sum|max|min中任意一个单词" && exit 0 case $str in sum) sum ;; max) max ;; min) min ;; *) echo "输入错误,请输入sum|max|min中任意一个单词" exit 0 esac