1、描述shell程序的运行原理(可附带必要的图形说明);

  SHELL是一种特殊的程序,官方定义为是和内核的接口,类似于内核的代理人。人类和LINUX系统对话时,需要一翻译,而shell就是这个翻译。我们用SHELL编辑自己想要执行的一系


列命令后,SHELL可以翻译给系统内核听,然后系统内核执行。

2、总结shell编程中所涉及到的所有知识点(如:变量、语法、命令状态等等等,要带图的哟);


//以下实例来自iredmail的安装脚本

tmprootdir="$(dirname $0)"  //定义临时目录,也就是shell中的变量
echo ${tmprootdir} | grep '^/' >/dev/null 2>&1
if [ X"$?" == X"0" ]; then   //根据上文中最后的命令状态,判断是否执行
    export ROOTDIR="${tmprootdir}"  //同时使用了命令状态和if判断
else
    export ROOTDIR="$(pwd)"
fi

# Create SSL/TLS cert file.
check_status_before_run generate_ssl_keys  //check_status_before_run是个函数


#下面是这个函数的定义
check_status_before_run()
{
    # If function was successfully executed, this function will write one line
    # in $STATUS_FILE:
    #
    #   export status_[function_name]='DONE'
    #
    function_name="${1}"  //利用位置参数来获得变量值
    function_status_name="status_${function_name}"
    function_status_value="$(eval echo \$${function_status_name})"
    if [ X"${function_status_value}" == X"DONE" ]; then
        ECHO_SKIP "Function: $1."
    else
        $function_name
        #if [ X"$?" == X'0' ]; then
        #    echo "export ${function_status_name}='DONE'" >> ${STATUS_FILE}
        #fi
    fi
}


#另一个函数的定义,用到了for循环,if判断

backup_file()
{
    # Usage: backup_file file1 [file2 file3 ... fileN]
    if [ X"$#" != X"0" ]; then   //$# 添加到Shell的参数个数
        for conf_file in $@; do  //利用for循环读取配置文件,
            if [ -f ${conf_file} ]; then
                if [ X"${IREDMAIL_DEBUG}" == X"YES" ]; then
                    echo -e "${_BACKUP_FLAG} ${conf_file} -> $(basename ${conf_file}).${DATE}."
                fi

                cp -f ${conf_file} ${conf_file}.${DATE}
            else
                :
            fi
        done
    else
        :
    fi
}




3、总结课程所讲的所有循环语句、条件判断的使用方法及其相关示例;(if (jpg|png is not exist);echo ”You say a XX“)

4、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;(不要怀疑,就是这么简单)

//目前就判断了目录和文件,其他类型的未做判断


cat a.sh 

#!/bin/bash


if [ -z $1 ];then

   echo "命令用法: sh a.sh 文件名或者目录"

   exit

fi


if [ -e $1 ];then

    if [ -d $1 ];then

      echo "$1存在且是一个目录"

    elif [ -f $1 ];then

      echo "$1存在且是一个文件"

    fi

else

    echo "文件或目录不存在" 

    mkdir $1

    echo "$1创建成功!!"

fi



[@iZ94lrg5ub8Z ~]$ sh a.sh /etc

/etc存在且是一个目录

[@iZ94lrg5ub8Z ~]$ sh a.sh lamp.zip 

lamp.zip存在且是一个文件

[@iZ94lrg5ub8Z ~]$ sh a.sh lamp

文件或目录不存在


$ sh a.sh lazz

文件或目录不存在

lazz创建成功!!

5、写一个脚本,完成如下功能;判断给定的两个数值,孰大孰小;给定数值的方法:脚本参数,命令交互;
$ vim read.sh


#!/bin/bash


echo  "请输入第一个数:"

read first


echo  "请输入第二个数:"

read second


if (( $first > $second ));then

   echo "第一个数比第二个数大"

else

   echo "第二个数比第一个数大"

fi


$ sh read.sh 

请输入第一个数:

22

请输入第二个数:

33

第二个数比第一个数大


6、求100以内所有奇数之和
di第一

第一种方法


[levis@iZ94lrg5ub8Z ~]$ sh b.sh 

2500

[levis@iZ94lrg5ub8Z ~]$ cat b.sh 

sum=0

for i in `seq 1 2 100`

do

   let sum=sum+$i

done


echo $sum


第二种方法:



[levis@iZ94lrg5ub8Z ~]$ sh b.sh  

2500

[levis@iZ94lrg5ub8Z ~]$ cat b.sh 

sum=0

for i in {1..100..2}

do

   let sum=sum+$i

done


echo $sum


第三种方法:

[levis@iZ94lrg5ub8Z ~]$ sh c.sh 

2500

[levis@iZ94lrg5ub8Z ~]$ cat c.sh 

#!/bin/bash


sum=0


for ((i=1;i<=100;i++))

do

  if [ `expr $i % 2` -ne 0 ];then

      let sum=$sum+$i

  fi

done


echo $sum

7、写一个脚本实现如下功能:

(1) 传递两个文本文件路径给脚本;

(2) 显示两个文件中空白行数较多的文件及其空白行的个数;

(3) 显示两个文件中总行数较多的文件及其总行数;

[levis@iZ94lrg5ub8Z ~]$ cat d.sh 
#!/bin/bash

file1=$1

file2=$2

if [ $# != 2 ];then
   echo "命令格式不对, 命令格式:  sh d.sh file1 file2"
   exit
fi

if [ ! -f $file1 ];then
   echo "file1 必须是文件格式"
   exit
fi


if [ ! -f $file2 ];then
   echo "file2 必须是文件格式"
fi


line1_space=`grep "^$" $file1 | wc -l`

line2_space=`grep "^$" $file2 | wc -l`

if (( $line1_space > $line2_space ));then
   echo "$file1的空白行数比较多,空行行数为$line1_space"
else
   echo "$file2的空白行数比较多,空行行数为$line2_space"
fi


line1_sum=`cat $file1 | wc -l`

line2_sum=`cat $file2 | wc -l`


if (( $line1_sum > $line2_sum ));then
   echo "$file1行数比较多,总行数为$line1_sum"
else
   echo "$file2行数比较多,总行数为$line2_sum"
fi

[levis@iZ94lrg5ub8Z ~]$ sh d.sh dd.txt /etc/init.d/functions 
/etc/init.d/functions的空白行数比较多,空行行数为72
/etc/init.d/functions行数比较多,总行数为812
[levis@iZ94lrg5ub8Z ~]$ sh d.sh /etc/rc. /etc/init.d/functions       
rc.d/       rc.local    rc.sysinit  
[levis@iZ94lrg5ub8Z ~]$ sh d.sh /etc/rc.sysinit /etc/init.d/functions 
/etc/rc.sysinit的空白行数比较多,空行行数为96
/etc/init.d/functions行数比较多,总行数为812

8、写一个脚本

(1) 提示用户输入一个字符串;

(2) 判断:

如果输入的是quit,则退出脚本;

否则,则显示其输入的字符串内容;

[levis@iZ94lrg5ub8Z ~]$ cat f.sh 
#!/bin/bash

while [ 1 -eq 1 ]
do
  echo  "输入一个字符串:"

  read answers

  if [ -z answers ];then
    echo "请输入字符串"
  fi
 
  if [ $answers == quit ];then

      echo "系统退出"
      exit
   fi

  echo "你输入的字符串是$answers"

  
done

[levis@iZ94lrg5ub8Z ~]$ sh f.sh 
输入一个字符串:
ss
你输入的字符串是ss
输入一个字符串:
erer
你输入的字符串是erer
输入一个字符串:
quit
系统退出
9、写一个脚本,打印2^n表;n等于一个用户输入的值;(不好意思,我调皮了)
[levis@iZ94lrg5ub8Z ~]$ cat a.sh 
#!/bin/bash

read -p "请输入一个数字:" num

count=2

for i in $(seq 0 $num);do
    if [ $i -eq 0 ];then
       echo -e "1"
    elif [ $i -eq 1 ];then
       echo -e "2"
    elif [ $i -gt 1 ];then
       count+=x2
       echo $count=$[2**$i]
    else echo "Error:请输入一个数字"
    fi

done

[levis@iZ94lrg5ub8Z ~]$ sh a.sh 
请输入一个数字:3
1
2
2x2=4
2x2x2=8

11、写一个脚本,写这么几个函数:函数1、实现给定的两个数值的之和;函数2、取给定两个数值的最大公约数;函数3、取给定两个数值的最小公倍数;关于函数的选定、两个数值的大小都将通过交互式输入来提供。

2015年9月13日课程作业--关于SHELL的问题_export

原地

源码地址:http://20150721.blog.51cto.com/10649191/1695664


补充的一题sed和awk的用法
SED的用法总结
AWK的用法总结