1、描述shell程序的运行原理(可附带必要的图形说明);
2、总结shell编程中所涉及到的所有知识点(如:变量、语法、命令状态等等等,要带图的哟);
shell总结
3、总结课程所讲的所有循环语句、条件判断的使用方法及其相关示例;
bash条件判断语句使用
bash循环语句使用
4、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;(不要怀疑,就是这么简单)
#!/bin/bash # if [ $# -ne 1 ] then echo "Usage:$0 directory" exit 1 fi if [ -d $1 ] then echo "$1 is exist" file $1 else mkdir -p $1 &>/dev/null if [ $? -ne 0 ] then echo "mkdir error" exit 2 fi fi #执行结果 [root@os01 /]# ./mkdir.sh test1 [root@os01 /]# ll -d test1/ drwxr-xr-x 2 root root 6 Sep 17 13:47 test1/ [root@os01 /]# ./mkdir.sh test1 test1 is exist test1: directory
5、写一个脚本,完成如下功能;判断给定的两个数值,孰大孰小;给定数值的方法:脚本参数,命令交互;(使用read,依然如此简单)
#!/bin/bash # read -p "plz input to num:" -t 10 num1 num2 if [ -z "$num1" -o -z "$num2" ]; then echo "Plz give two integers." exit 1 fi if [ $num1 -gt $num2 ] then echo "Max:$num1 , Min:$num2" elif [ $num1 -lt $num2 ] then echo "Max:$num2 , Min:$num1" else echo "$num1 equal $num2" fi #执行结果 [root@os01 /]# ./read.sh plz input to num: Plz give two integers. [root@os01 /]# ./read.sh plz input to num:9 5 Max:9 , Min:5 [root@os01 /]# ./read.sh plz input to num:9 9 9 equal 9
6、求100以内所有奇数之和(至少用3种方法。是的这是我们的作业^_^)
第一种:for
#!/bin/bash declare -i num=0 for i in `seq 1 2 100` do num+=i # num=$[$num+$i] done echo "sum is $num" 执行结果: [root@os01 /]# ./1.sh sum is 2500
第二种:while
#!/bin/bash # declare -i i=1 declare -i sum=0 while [ $i -le 100 ] do sum+=i let i+=2 done echo "sum is $sum" #执行结果 [root@os01 /]# ./2.sh sum is 2500
第三种:for contniue
#!/bin/bash declare -i i=1 declare -i sum=0 for i in `seq 1 100` do if [ $[$i%2] -eq 0 ] then continue fi sum+=i done echo "sum is $sum" #执行结果 [root@os01 /]# ./3.sh sum is 2500
第四种:until
#!/bin/bash # declare -i i=0 declare -i sum=0 until [ $i -eq 100 ] do let i++ if [ $[$i%2] -eq 0 ] then continue fi sum+=i done echo "sum is $sum" [root@os01 /]# ./4.sh sum is 2500
7、写一个脚本实现如下功能:
(1) 传递两个文本文件路径给脚本;
(2) 显示两个文件中空白行数较多的文件及其空白行的个数;
(3) 显示两个文件中总行数较多的文件及其总行数;
#!/bin/bash # read -p "plz input two file or dir path:" -t 50 f1 f2 if [ -z $f1 -o -z $f2 ] then echo "Usg:$0 /path/file1 /path/file2" exit 1 fi if [ ! -e $f1 -o ! -e $f2 ] then echo "$f1 or $f2 not exist" exit 2 fi f1_s=`grep '^$' $f1|wc -l` f2_s=`grep '^$' $f2|wc -l` if [ $f1_s -gt $f2_s ] then echo "space_max: $f1 : $f1_s;" elif [ $f1_s -lt $f2_s ] then echo "space_max: $f2 : $f2_s;" else echo "$f1,$f2 space lines is eq;space_line= $f1_s" fi f1_lines=`wc -l $f1|cut -d" " -f1` f2_lines=`wc -l $f2|cut -d" " -f1` if [ $f1_lines -gt $f2_lines ] then echo "max_lines: $f1 :$f1_lines ;" elif [ $f1_lines -lt $f2_lines ] then echo "max_lines: $f2 : $f2_lines ;" else echo "$f1,$f2 lines is eq" echo "$f1 lines: $f1_lines , space_lines: $f1_s" echo "$f2 lines: $f2_lines , space_lines: $f2_s" fi #执行结果 [root@os01 dir]# ./6.sh plz input two file or dir path: Usg:./6.sh /path/file1 /path/file2 [root@os01 dir]# ./6.sh plz input two file or dir path:a.txt b.txt a.txt,b.txt space lines is eq;space_line= 3 max_lines: b.txt : 9 ;
8、写一个脚本
(1) 提示用户输入一个字符串;
(2) 判断:
如果输入的是quit,则退出脚本;
否则,则显示其输入的字符串内容;
#!/bin/bash read -p "plz input one char:" -t 20 char if [ -z $char ] then echo "Usg: $0 Character" exit 1 fi case $char in quit) exit 0 ;; *) echo "$char" esac #执行结果 [root@os01 dir]# ./4.sh plz input one char:Usg: ./4.sh Character #超时未输入退出 [root@os01 dir]# ./4.sh plz input one char:quit #退出脚本
9、写一个脚本,打印2^n表;n等于一个用户输入的值;(不好意思,我调皮了)
两个结果不知道要求哪个。
#!/bin/bash read -p "plz input a num:" -t 10 num if [ -z $num ] then exit 1 fi echo "2^0=1" echo "2^1=2" for i in `seq 2 $num` do a+=x2 echo "2$a=$[2**$i]" done #执行结果 [root@os01 dir]# ./mi.sh plz input a num:10 2^0=1 2^1=2 2x2=4 2x2x2=8 2x2x2x2=16 2x2x2x2x2=32 2x2x2x2x2x2=64 2x2x2x2x2x2x2=128 2x2x2x2x2x2x2x2=256 2x2x2x2x2x2x2x2x2=512 2x2x2x2x2x2x2x2x2x2=1024
第二个:
#!/bin/bash read -p "plz input a num:" -t 10 num if [ -z $num ] then exit 1 fi for i in `seq 0 $num` do echo "2^$i=$[2**$i]" done #执行结果: [root@os01 dir]# ./test.sh plz input a num:6 2^0=1 2^1=2 2^2=4 2^3=8 2^4=16 2^5=32 2^6=64
10、写一个脚本,写这么几个函数:函数1、实现给定的两个数值的之和;函数2、取给定两个数值的最大公约数;函数3、取给定两个数值的最小公倍数;关于函数的选定、两个数值的大小都将通过交互式输入来提供。
函数脚本:/shell/hs.sh 执行脚本:/shell/cal.sh
函数脚本:
取最大公约数思路:两个数值从1到较小数字都必须同时取余数为0,依次取出公约数覆盖输出到文件,最后一个为最大公约数。
取最小公倍数思路:从1到两个数字乘积循环取余数,较大数依次与循环变量相乘再对较小数字取余,当余为0时,为最小公倍数。
两个数字乘积肯定是公约数,所以从1到两个数乘积循环,从大的数字X1,X2,X3一直到两个数字乘积,第一个能对小的数字取余数为0(跳出break)的为最小公倍数。
#!/bin/bash #错误函数====================================================== error() { if [ -z $m -o -z $n ] then echo "请输入两个数值" exit 1 fi } #计算两个整数之和================================================ zh() { read -p "请输入两个整数,计算它们的和:" -t 10 m n error zonghe=$[$m+$n] echo $zonghe } #计算最大公约束==================================================== zdgys() { read -p "请输入两个整数,计算它们的最大公约数:" -t 10 m n error if [ $m -gt $n ] then for i in `seq 1 $n` do if [ $[$n%$i] -eq 0 -a $[$m%$i] -eq 0 ] then echo $i>/tmp/max1.txt fi done cat /tmp/max1.txt elif [ $m -le $n ] then for i in `seq 1 $n` do if [ $[$n%$i] -eq 0 -a $[$m%$i] -eq 0 ] then echo $i>/tmp/max2.txt fi done cat /tmp/max2.txt fi } #计算最小公倍数===================================================== zxgbs() { read -p "请输入两个数字,计算它们的最小公倍数:" -t 10 m n error if [ $m -gt $n ] then for j in `seq 1 $[$m*$n]` do if [ $[$m*$j%$n] -eq 0 ] then echo "$[$m*$j]" break fi done elif [ $m -le $n ] then for j in `seq 1 $[$m*$n]` do if [ $[$n*$j%$m] -eq 0 ] then echo "$[$n*$j]" break fi done fi }
执行脚本:/shell/cal.sh
#!/bin/bash read -p "plz input 'zh'|'zdgys'|'zxgbs':" -t 20 char . /shell/hs.sh case $char in zh) zh ;; zdgys) zdgys ;; zxgbs) zxgbs ;; *) echo "input error:Usg:'zh'|'zdgys'|'zxgbs'" esac #执行结果: [root@os01 ~]# ./cal.sh plz input 'zh'|'zdgys'|'zxgbs':zh 请输入两个整数,计算它们的和:10 90 100 [root@os01 ~]# ./cal.sh plz input 'zh'|'zdgys'|'zxgbs':zdgys 请输入两个整数,计算它们的最大公约数:10 90 10 [root@os01 ~]# ./cal.sh plz input 'zh'|'zdgys'|'zxgbs':zxgbs 请输入两个数字,计算它们的最小公倍数:10 90 90 [root@os01 ~]# ./cal.sh plz input 'zh'|'zdgys'|'zxgbs':as^H input error:Usg:'zh'|'zdgys'|'zxgbs'