作业(练习)内容:

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

Shell(外壳):交互式进程。编译器,解释器

shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。

 

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

   面向对象:把整个我们要实现的项目抽象成一个一个的对象并且定义对象之间的动作

面向过程:把编程着源点立足点主要在问题解决过程本身

脚本或程序源文件:文本文件

两种方式:

        编译执行:预处理-->编译-->汇编-->链接;事先完成,结果:二进制程序文件C, C++

        解释执行:由解释器全程参与运行过程,每次读取一行,运行一行;

    程序:指令+数据

        算法+数据结构

        过程式编程:以指令为中心,设计算法,数据服务于算法;

        对象式编程:以数据为中心,设计数据结构(类),程序服务于数据结构;

        bash过程式编程:

            顺序执行:逐个执行

            选择执行:只执行其中一个分支

            循环执行:一段代码要执行0,1或多遍

            编程元素:变量、流程、函数

    变量:可变化的量,命名内存空间

        bash环境:

            本地变量:当前shell进程;

                    name=value

                        name: 变量名

                        =:赋值符号

                        value:值

                变量名:只能包含数字、字母和下划线;且不能以数字开头;

                引用变量:${name}, $name

                    弱引用: "", 其内部的变量引用会被替换为变量值;

                    强引用:'',其变量的变量引用会保持原有字符;

                    命令引用:`COMMAND`,$(COMMAND),引用命令的执行结果;

                声明为整型:

                    declare -i name[=value]

                    letname=value

            环境变量:当前shell进程及其子进程;

                        被”导出”的本地变量

                            exportname[=value]

                            declare-x name[=value]

                        查看所有环境变量:env, printenv, export

                    销毁:

                        unsetname

            局部变量:某个函数执行过程;

            位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;

            特殊变量:$?, $*, $@, $#, $$

变量类型:

数值:整数,浮点数

字符:ASCII

作用:存储空间,运算,存储格式

 

脚本:文本文件

         脚本运行,事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后bash解析并运行此逻辑

         启动脚本:

                   1#bash /PATH/TO/SCRIPT_FILE

                   2)一个执行权限

                                     #./PATH/TO/SCRIPT_FILE

         第一行:顶格给出shebang

                   注释行:#

         bash的常用选项:

                            -n:检查脚本中的语法错误;

                            -x:调试执行脚本;

条件测试:

                   界定程序执行环境;

 

                   (1) 根据运行的命令的状态结果;

                   (2) 测试表达式

                            testEXPRESSION

                            [EXPRESSION ]

                            `EXPRESSION `

 

整数测试:隐含着做数值大小比较,所以不要给变量引用加引用;

      $A-gt $B:是否大于;是则为“真”,否则为“假”;

      $A-ge $B: 是否大于等于;

      $A-lt $B:是否小于;

      $A-le $B: 是否小于等于;

      $A-eq $B: 是否等于;

      $A-ne $B:是否不等于;

[root@localhost bin]# A=3[root@localhost bin]# B=8[root@localhost bin]# [ $A -gt $B ][root@localhost bin]# echo $?1

符串测试:ASCII数值越大,字符比较时其值越大;

      "$A"> "$B":是否大于;

      "$A"< "$B":是否小于;

      "$A"== "$B":是否等于;

      "$A"!= "$B":是否不等于;

      -z"$A":是否为空;空则为“真”,否则为“假”

      -n"$A":是否不空;不空则“真”,空则为“假”

[root@localhost bin]# A=3[root@localhost bin]# B=8[root@localhost bin]# [ "$A" != "$B" ][root@localhost bin]# echo $?0[root@localhost bin]#

注意:应该使用` EXPRESSION `

 

文件测试:测试文件的存在性以及属性;

      -e$file: 是否存在;存在则为“真”,否则为“假”;

      -a$file: 同上;

      -f$file:文件是否存在且为普通文件;

      -d$file:文件是否存在且为目录;

      -h$file:是否存在且为符号链接文件;

      -L$file: 同上

      -b$file:是否存在且为块设备文件;

      -c$file:是否存在且为字符设备文件;

      -S$file:是否存在且为套接字文件;

      -p$file: 是否存在且为管道文件;

[root@localhost bin]# [ -e /etc/fstab ][root@localhost bin]# echo $?0

      -r$file: 当前用户对文件是否拥有读权限;

      -w$file:当前用户对文件是否拥有写权限;

      -x$file:当前用户对文件是否拥有执行权限;

[root@localhost bin]# [ -r /etc/fstab ][root@localhost bin]# echo $?0[root@localhost bin]# [ -w /etc/fstab ][root@localhost bin]# echo $?0[root@localhost bin]# [ -x /etc/fstab ][root@localhost bin]# echo $?1

      -u $file:文件是否拥有SUID权限;

      -g$file:文件是否拥有SGID权限;

      -k$file:文件是否拥有sticky权限;

 

      -O$file: 当前用户是否为指定文件的属主;

      -G$file: 当前用户是否为指定文件的属组;

 

双目操作符:

    $file1-nt $file2: file1是否新于file2, file1的最近一次的修改时间戳是否晚于file2的;

    $file1-ot $file2: file1是否旧于file2, file1的最近一次的修改时间戳是否早于file2的;

    $file1-ef $file2file1file2是否指向了同一个inode;测试二者是否为同一个文件的硬链接;

 

特殊设备:

   /dev/null:空,bit buckets,吞下所有数据,并直接丢弃;

   /dev/zero:吐出一N多个0

     特殊变量:

        $?:命令的状态结果;

        $#:传递给脚本或函数的参数的个数;

        $*$@: 引用传递给脚本或函数的参数列表;

 

     shift[n]:轮替

 

bash之条件判断(选择执行):

                   if/then,case

 

[root@localhost bin]# vi 1.sh#!/bin/bash#username=user1if ! id $username &> /dev/null; then   useradd $username   echo $username | passwd--stdin $username &> /dev/nullfi

 

 while, until

 

 

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

循环语句:for, while, until

for 对一段语句重复读取执行,一般均设置一个退出或进入循环的条件来控制循环的次数

for语法:

for 变量名 in 列表;do

循环类容

done

进入条件:列表非空

退出条件:列表遍历结束

循环语句:

         for,         #!/bin/bashfor username in$(cut -d: -f1 /etc/passwd); do                            echo "$username primary group:$(id -n -g $username)."DoneUntil

until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。

until 循环格式为:

until command

do

   Statement(s) to beexecuted until command is true

done

command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

例如,使用 until 命令输出 0 ~ 9 的数字:

 

        #!/bin/bash         a=0         until [ ! $a –lt10 ]         do                   echo $a                   a=expr$a + 1         done

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

#!/bin/bash#filname="/tmp/s/d/testdit"if [ -e $filname ]; then         echo"$filname 已经存在"         file $filnameelse         mkdir -p $filname         echo "&dd$filname 完成"fi

 

5、写一个脚本,完成如下功能;判断给定的两个数值,孰大孰小;给定数值的方法:脚本参数,命令交互;(使用read,依然如此简单)

#!/bin/bashread -p "输入两个整数整数之间空格隔开:" -t 10 num1num2if [ -z "$num1" ]; then         echo "输入一个整数。"         exit 1fiif [ -z "$num2" ]; then         echo "输入一个整数。"         exit 1fiif [ $num1 -ge $num2 ]; then         echo "大: $num1, 小: $num2."else         echo "大: $num2, 小: $num1."fi

6、求100以内所有奇数之和(至少用3种方法。是的这是我们的作业^_^)

#!/bin/bashdeclare -i sum=0for i in {1..100}; do         if [ $[$i%2] -ne 0]; then                   sum=$[$sum+$i]         fidoneecho "$sum"

#!/bin/bashdeclare -i sum=0for i in {1..100}; do         if [ $[$i%2] -ne 0]; then                   sum=$[$sum+$i]         fidoneecho "$sum"

 

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

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

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

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

    8、写一个脚本

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

            (2) 判断:

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

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

    9、写一个脚本,打印2^n表;n等于一个用户输入的值;(不好意思,我调皮了)

    10、写一个脚本,写这么几个函数:函数1、实现给定的两个数值的之和;函数2、取给定两个数值的最大公约数;函数3、取给定两个数值的最小公约数;关于函数的选定、两个数值都将通过脚本参数进行输入。