bash之脚本入门及课后作业

概述:

shell是一个工具程序,在用户登录后后系统启动,它解释并运行由命令或脚本文件输入的命令,从而实现用户与内核之间的交互。bash是Linux操作系统上默认的shell,在交互和编程两方面,bash提供了许多Bourne shell没有的功能,并且还结合了C shell和Kron shell最有用的功能。

bash的语法和结构

    1、shbang行:

        shbang行是脚本的第一行,它通知内核使用哪种shell解释脚本中的行

 #!/binbash

    2、注释:

        注释由一个#号后跟一些描述性的说明组成,它们可以从行的任意位置开始,在行的末尾结束。

 2 #10user id add 20user id sum
 3 #author:xiaoshui

    3、显示输出

        echo命令用于向屏幕显示输出,通配符必须使用反斜线和配对引号进行转意

1 #!/bin/bash
2 #function: hello world
3 #author:xiaoshui
4 echo "hello world"

    4、局部变量

        局部变量的作用域被限定在当前的shell中,当一个脚本执行结束,它们不可再用。也就是说它们超出了作用域,生效范围为当前shell进程中某代码片断(通常指函数)

    5、本地变量

        本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效。

[root@localhost ~]# var2=two //在当前shell中定义var2
[root@localhost ~]# chmod +x test1.sh 
[root@localhost ~]# ./test1.sh 
one

[root@localhost ~]# vi test1.sh

  1 #!/bin/bash
  2 #test local var
  3 var1=one
  4 echo "$var1"
  5 echo "$var2" //显示不了父进程定义的var2

    6、环境变量

        生效范围为当前shell进程及其子进程

[root@localhost ~]# unset var2 //取消var2的值
[root@localhost ~]# export var2=two //设置var2为环境变量
[root@localhost ~]# ./test1.sh  //执行test1脚本
one
two
[root@localhost ~]# vi test1.sh 

  1 #!/bin/bash
  2 #test local var
  3 var1=one
  4 echo "$var1"
  5 echo "$var2" //调用父进程的var2

        显示所有环境变量:export,env,printenv

    7、位置变量

       $1, $2, …来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

[root@localhost ~]# vi v2.sh 

  1 #!/bin/bash
  2 #function: test //此实验的目的就是为了测试$10是${10}还是$1+0
  3 #author: xiaoshui
  4 
  5 echo $10  
  6 echo $11
  7 echo $12
  8 echo "=========="
  9 echo ${10}
 10 echo ${11}
 11 echo ${12}
[root@localhost ~]# ./v2.sh a b c d e f g h i j k l
a0     //很显然,结果为$1+0
a1     //同样结果为$2+1
a2
==========
j      //显然此为${10}
k      //${11}
l

        上述例子表明,位置变量$1..$9中,变量引用没有问题,当到了$10以后,此时如果不把10用花括号括住,则会被识别为$1+#(#为数字)

    8、特殊变量

        $0: 命令本身
        $*: 传递给脚本的所有参数,全部参数合为一个字符串
        $@: 传递给脚本的所有参数,每个参数为独立字符串
        $#: 传递给脚本的参数的个数

            $@ $* 只在被双引号包起来的时候才会有差异

[root@localhost test]# vi test2.sh 

  1 #!/bin/bash
  2 # test
  3 echo "file name: $0"
  4 echo "first argue: $1"
  5 echo "two argue: $2"
  6 echo "all argues: "$*""
  7 echo "all argues: "$@""
  8 echo "argue numbers: $#"
  9 touch file_"$*" //利用touch来测试$*和$@的区别,
 10 touch file."$@" //
[root@localhost test]# ./test2.sh 1 2 3
file name: ./test2.sh
first argue: 1
two argue: 2
all argues: 1 2 3
all argues: 1 2 3
argue numbers: 3
[root@localhost test]# ll
total 4
-rw-r--r-- 1 root root   0 Aug 12 16:28 2 //词尾$@第二个
-rw-r--r-- 1 root root   0 Aug 12 16:28 3//此为$@第三个
-rw-r--r-- 1 root root   0 Aug 12 16:28 file.1//此为$@第一个
-rw-r--r-- 1 root root   0 Aug 12 16:28 file_1 2 3//仔细观察可以发现此为$*
-rwxr-xr-x 1 root root 189 Aug 12 16:28 test2.sh

    由上述例子可以得出,$*全部参数合为一个字符串,$@每个参数为独立字符串

课后作业:

1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。

2016-08-12_085244.png

2016-08-11_195422.png

2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中

2016-08-12_085324.png
2016-08-11_200133.png

    

3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

2016-08-12_085357.png

2016-08-11_200849.png

4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

2016-08-12_085433.png

2016-08-11_202333.png

5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

2016-08-12_085509.png

2016-08-11_202932.png

6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

2016-08-12_085544.png

2016-08-11_203949.png

7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

2016-08-12_085619.png

2016-08-11_204553.png

7、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

2016-08-11_203949.png

2016-08-11_205357.png

8、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

2016-08-12_085705.png

2016-08-11_205941.png

9、chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写

2016-08-12_085740.png2016-08-11_210846.png2016-08-11_210856.png

10、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。

2016-08-12_090000.png

2016-08-12_090028.png

11、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问

2016-08-12_103240.png2016-08-11_222718.png

12、计算1+2+3+…+100的值

2016-08-12_091332.png2016-08-12_091412.png

13、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之

2016-08-12_102448.png

2016-08-12_102514.png

备注:第十一题和第十三题注释区域有疑问。

原创文章,作者:我的滑板鞋,如若转载,请注明出处:http://www.178linux.com/34005

(0)
我的滑板鞋我的滑板鞋
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • 马哥Linux学习之Linux背景和主要发行版篇

        Linux是一种 类Unix计算机操作系统的统称,简单的说来就是Linux内核+GNU工程的各种工具和数据库。Linux包括各种Linux的发行版,其实也就是为达到不同的目的而制作(目的包括对不同计算机结构的支持,对一个具体区域或语言的本地化,实时应用或嵌入式)的不同版本。     Linux的由来.…

    2015-03-19
  • 文件的权限和访问控制列表

      在linux管理中,为了使不同的用户对文件有不同的操作权限。我们需要正确的修改文件的权限,一方面是为安全着想, 另一方面则是防止自己辛辛苦苦码出的东西被其它用户给误删。 1.如何修改文件的属主和属主:   前面用户和组管理的内容中,我们已经对文件的属主、属组问题做了说明。有时候我们需要对一些文件的属组和属组进行修改…

    Linux干货 2016-08-04
  • 马哥教育网络班22期+第1周课程练习

    马哥教育网络班22期+第1周课程练习 1、描述计算机的组成及其功能。 CPU (运算器+控制器), 存诸器(内存与外存),输入设备,输出设备。 运算器:对数据进行加工处理的部件(包括算述运算与逻辑运算)。 控制器:负责从存储器取出指令,按指令的要求发出控制信号,使各部件协调的,一步步的完成各种操作。 存储器:计算机记忆或暂存数据的部件 输入设备:人机接口,负…

    Linux干货 2016-08-12
  • Linux软件包管理及相关命令

    rpm命令,yum命令

    2018-03-12
  • 马哥教育网络班21期+第14周课程练习

    iptables关键点 表:filter(过滤,防火墙);nat(网络地址转换);mangle(拆解报文,做出修改,封装报文);raw(关闭nat表启用的链接追踪机制);上述是根据功能来区分的,写规则要明白要实现的功能 链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING 数据流向:流入PREROUTING–…

    Linux干货 2016-08-26
  • 探索处理文本工具“sed”的相关奥妙

    一:sed工具 1,set的介绍:sed是一种流编辑器,它一次处理一行内容。处理时,把当前 处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断…

    2017-08-26

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-16 15:48

    总结的很详细,思路很清晰,作业完成的很用心,再接再厉,