一、作业(练习)内容:
1、描述shell程序的运行原理(可附带必要的图形说明);
2、总结shell编程中所涉及到的所有知识点(如:变量、语法、命令状态等等等,要带图的哟);
3、总结课程所讲的所有循环语句、条件判断的使用方法及其相关示例;(if (jpg|png is not exist);echo ”You say a XX“)
4、总结文本处理工具sed及awk的用法;(必须附带示例)
5、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;(不要怀疑,就是这么简单)
#/bin/bash #Program: # 一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型 # roger 20150920 read -p "请输入一个路径:" dir [ -z "$dir" ] && echo "必须要输入一个路径" && exit 0 if (ls "$dir" &> /dev/null ); then fileType=$(file "$dir") echo "$dir 路径存在其文件内容类型为:$fileType" else mkdir -p $dir echo "$dir 路径不存在,创建目录 $dir" fi
6、写一个脚本,完成如下功能;判断给定的两个数值,孰大孰小;给定数值的方法:脚本参数,命令交互;(使用read,依然如此简单)
#/bin/bash #Progrom: # 判断给定的两个数值,孰大孰小;给定数值的方法:脚本参数 # roger 20150920 [ -z $1 ] && [ -z $2 ]&& echo "请输入两个整数 > {CompareNum.sh num1 num2 }" && exit 0 #判断输入的是不是整数 num1=$(echo $1 | grep '^[0-9]\+$') num2=$(echo $2 | grep '^[0-9]\+$') [ -z $num1 ] && echo "$1 输入的不是整数" && exit 0 [ -z $num2 ] && echo "$2 输入的不是整数" && exit 0 #比较两个数大小 [ $1 -lt $2 ] && echo "$1 < $2 " && exit 0 [ $1 -gt $2 ] && echo "$1 > $2 " && exit 0 [ $1 -eq $2 ] && echo "$1 = $2 " && exit 0
#/bin/bash #Progrom # 判断给定的两个数值,孰大孰小;给定数值的方法:交互输入 # roger 20150920 #输入两个整数 read -p "请输入两个整数:" num1 num2 [ -z $num1 ] && [ -z $num2 ]&& echo "必须输入两个整数!! " && exit 0 #判断输入的是不是整数 testnum1=$(echo $num1 | grep '^[0-9]\+$') testnum2=$(echo $num2 | grep '^[0-9]\+$') [ -z $testnum1 ] && echo "$num1 输入的不是整数" && exit 0 [ -z $testnum2 ] && echo "$num2 输入的不是整数" && exit 0 #比较两个数大小 [ $num1 -lt $num2 ] && echo "$num1 < $num2 " && exit 0 [ $num1 -gt $num2 ] && echo "$num1 > $num2 " && exit 0 [ $num1 -eq $num2 ] && echo "$num1 = $num2 " && exit 0
7、求100以内所有奇数之和(至少用3种方法。是的这是我们的作业^_^)
#!/bin/bash # Program: # 100以内所有奇数的和 三种方法 # roger 20150920 PATH=/bin:/sbin/:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo "计算方法选择" echo "1 使用i=1 i+=2奇数增长计算;for循环" echo "2 使用i%2!=0判断奇数;for循环" echo "3 使用while循环判断计算" read -p "请选择使用哪种方法计算(ex. 1):" method sum=0 i=1 case $method in "1") for i in $(seq 1 2 100) do sum=$[$sum + $i] done ;; "2") for i in {1..100} do if [ $(($i%2)) != "0" ]; then sum=$[$sum + $i] fi done ;; "3") while [ "$i" -le "100" ] do sum=$[$sum + $i] i=$(($i+2)) done ;; *) echo "您的输入有误!请选择输入1 / 2 / 3" exit 0; esac #输出结果 echo "1+3+5+...+97+99求和 sum= $sum"
8、写一个脚本实现如下功能:
(1) 传递两个文本文件路径给脚本;
(2) 显示两个文件中空白行数较多的文件及其空白行的个数;
(3) 显示两个文件中总行数较多的文件及其总行数;
#!/bin/bash # Program: # 写一个脚本实现如下功能: # (1) 传递两个文本文件路径给脚本; # (2) 显示两个文件中空白行数较多的文件及其空白行的个数; # (3) 显示两个文件中总行数较多的文件及其总行数; PATH=/bin:/sbin/:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH #提示输入 read -p "请输入两个文本文件路径" txtPath1 txtPath2 #输入check [ ! -f $txtPath1 ] && echo "您输入的文件不是文本文件" && exit 0 [ ! -f $txtPath2 ] && echo "您输入的文件不是文本文件" && exit 0 #显示两个文件中空白行数较多的文件及其空白行的个数; ##空白行数 spLines1=$( grep '^$' $txtPath1 | wc -l ) spLines2=$( grep '^$' $txtPath2 | wc -l ) ##比较空白行数 if [ $spLines1 -lt $spLines2 ]; then echo -e "空白行较多的文本文件是: $txtPath2 \n空白行数是: $spLines2 " elif [ $spLines1 -gt $spLines2 ]; then echo -e "空白行较多的文本文件是: $txtPath1 \n空白行数是: $spLines1 " else echo -e " $txtPath1 和 $txtPath2 空白行数相等,空白行数是: $spLines1 " fi #显示两个文件中总行数较多的文件及其总行数; ##总行数 sumLines1=$( wc -l $txtPath1 | cut -d ' ' -f1 ) sumLines2=$( wc -l $txtPath2 | cut -d ' ' -f1 ) ##比较总行数 if [ "$sumLines1" -lt "$sumLines2" ]; then echo -e "总行较多的文本文件是: $txtPath2 \n总行数是: $sumLines2 " elif [ "$sumLines1" -gt "$sumLines2" ]; then echo -e "总行较多的文本文件是: $txtPath1 \n总行数是: $sumLines1 " else echo -e " $txtPath1 和 $txtPath2 总行数相等,总行数是: $sumLines1 " fi
9、写一个脚本
(1) 提示用户输入一个字符串;
(2) 判断:
如果输入的是quit,则退出脚本;
否则,则显示其输入的字符串内容;
#!/bin/bash # Program: # 写一个脚本 # (1) 提示用户输入一个字符串; # (2) 判断: # 如果输入的是quit,则退出脚本; # 否则,则显示其输入的字符串内容; # # roger 20150920 PATH=/bin:/sbin/:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "请输入一个字符串:" str [ -z $str ] && echo "您输入的是空字符串" && exit 0 if [ $str = "quit" ]; then exit 0 else echo "您输入的内容是:"$str" " fi
10、写一个脚本,打印2^n表;n等于一个用户输入的值;(不好意思,我调皮了)
#!/bin/bash # Program: # 打印2^n表;n等于一个用户输入的值; # # roger 20150920 PATH=/bin:/sbin/:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "请输入一个整数:" n num=$( echo $n | grep '^[0-9]\+$') [ -z $num ] && echo "您输入的不是整数" && exit 0 i=0 while [ $i -le $n ] do echo "2^$i=$((2**$i))" let i++ done
11、写一个脚本,写这么几个函数:函数1、实现给定的两个数值的之和;函数2、取给定两个数值的最大公约数;函数3、取给定两个数值的最小公倍数;关于函数的选定、两个数值的大小都将通过交互式输入来提供。
#!/bin/bash # Program: # 写一个脚本,写这么几个函数: # 函数1、实现给定的两个数值的之和; # 函数2、取给定两个数值的最大公约数; # 函数3、取给定两个数值的最小公倍数; # 关于函数的选定、两个数值的大小都将通过交互式输入来提供。 # roger 20150920 PATH=/bin:/sbin/:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo "选择使用的功能:" echo "1 实现给定的两个数值之和" echo "2 取给定两个数值的最大公约数" echo "3 取给定两个数值的最小公倍数" #因为read 是后面加上的,所以在判断传入参数是使用$1 $2出现问题,修改完后没有测试,所以出现错误 #read -p "请输入两个整数: " num1 num2 ####判断输入是不是空 ###[ -z $1 ] && [ -z $2 ]&& echo "必须输入两个整数" && exit 0 ####判断输入的是不是整数 ##num1=$(echo $1 | grep '^[0-9]\+$') ##num2=$(echo $2 | grep '^[0-9]\+$') ##[ -z $num1 ] && echo "$1 输入的不是整数" && exit 0 ##[ -z $num2 ] && echo "$2 输入的不是整数" && exit 0 #正确的代码: read -p "请输入两个整数: " n1 n2 #判断输入是不是空 [ -z $n1 ] && [ -z $n2 ]&& echo "必须输入两个整数" && exit 0 #判断输入的是不是整数 num1=$(echo $n1 | grep '^[0-9]\+$') num2=$(echo $n2 | grep '^[0-9]\+$') [ -z $num1 ] && echo "$n1 输入的不是整数" && exit 0 [ -z $num2 ] && echo "$n2 输入的不是整数" && exit 0 read -p "请选择使用哪种方法计算(ex. 1):" method declare -i resultSum=0 #两整数之和 declare -i resultGcd=0 #最大公约数 declare -i resultLcm=0 #最小公倍数 #求和 function sum() { resultSum=$(($1+$2)) } #最大公约数 function gcd() { a=$1 b=$2 if [ $1 -lt $2 ]; then c=$a a=$b b=$c fi while [ "$b" != 0 ] do c=$[ $a%$b ] a=$b b=$c done resultGcd=$a } #最小公倍数 function lcm(){ lcma=$[ $1*$2 ] gcd $1 $2 lcmb=$resultGcd resultLcm=$[ $lcma/$lcmb ] } case $method in "1") sum $num1 $num2 echo "结果是:$num1 + $num2 = $resultSum" ;; "2") gcd $num1 $num2 echo "$num1"和"$num2"的最大公约数是:"$resultGcd" ;; "3") lcm $num1 $num2 echo "$num1"和"$num2"的最小公倍数是:"$resultLcm" ;; *) echo "您输入带有错误,请输入 1 或 2 或 3 " exit 0 esac
如有错误,敬请指正!
谢谢!