​Bash2

字串比较时变量最好使用""

blob.png

这样就不会报错了,只是退出码不为0

组合条件:

    与:[ condition1 -a condition2 ]或condition1 && condition2

    或:[ condition1 -o condition2 ]或condition1 || condition2

     非:[ -not condition ]或者 ! condition

练习:如果当前主机的主机名为空,或为'localhost',将其修改为www.magedu.com

blob.png

练习:如果某用户存在,且answer变量的值为"yes",则显示用户的id号,否则,说用户选择了退出

if id $userName &> /dev/null && [ "$answer" == "yes" ];then

    …

fi

练习:给定一个用户,如果其shell为/bin/bash,且其id号大于等于500,则说明这是一个可登陆普通用户,否则,显示其为非登陆用户或管理员

blob.png

写脚本:

1、查看传递参数个数

2、判断参数类型等

3、逻辑等

练习:

如果某用户不存在,则添加之

blob.png

练习:

1、添加10个用户,如果用户不存在,则添加,如果存在就显示已经有此用户

2、显示一共添加了多少个用户

blob.png

练习:

1、添加10个用户,如果用户不存在,则添加并以绿色显示添加成功,如果存在就显示已经有此用户并以红色显示

2、显示一共添加了多少个用户

blob.png

blob.png

文件测试:

-a file:文件存在则为真

-e file:文件存在则为真

以上两者可能是文件、目录、链接

-f file:文件存在并且是普通文件则为真

-d file:存在并且为目录文件则为真

-h/L file:存在并且为符号链接则为真

-b file:存在并且为块设备则为真

-c file:存在并且为字符设备则为真

-S file:存在并且为套接字则为真

-p file:存在并且为管道则为真

-s file:存在并且为非空文件则为真

-r file:存在并且可读则为真

-w file:存在并且可写则为真

-x file:存在并且可执行则为真

-N file:存在并且mtime比atime新

file1 -nt file2:file1比file2新则为真

file1 -ot file2:file1比file2旧则为真

file1 -ef file2:file1比file2新则为真

练习:如果wget命令对应的可执行文件存在且可执行,则使用它下载http://172.16.0.1/centos6.5.repo至当前目录中

blob.png

练习:给定一个文件路径,判断此文件是否存在,不存在则说明文件不存在直接结束脚本;如果文件是一个普通文件,则显示为“regular file”,如果文件是目录,则显示为“directory”,如果文件是链接文件,则显示为“symbolic file”,否则显示为“unknown”

blob.png

blob.png

练习:脚本完成以下任务

1、分别复制/var/log下的文件至/tmp/logs目录

2、复制目录时,才使用cp -r

3、复制文件,使用cp

4、复制链接,使用cp -d

5、余下的类型,使用cp -a

写一个脚本,完成如下任务,其使用形式如下所示:

script.sh {start|stop|restart|status}

其中:

如果参数为空,则显示帮助信息,并退出脚本;

如果参数为start,则创建空文件/var/lock/subsys/script,并显示“starting script successfully.”

如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script successfully.”

如果参数为restart,则删除文件/var/locksubsys/script并重新创建,而后显示“Restarting script successfully.”

如果参数为status,那么:

如果文件/var/lock/subsys/script存在,则显示“Script is running…”,否则,则显示“Script is stopped.”

说明:script.sh是脚本文件名,在创建时,其名称可以自己随意定义,但如果其名称发生变量,上/var/lock/sussys/下的文件名也要随之而变;

交互编程:

read

    -p:"提示"

    -t:超时

blob.png

blob.png

例子:显示一个如下菜单给用户:

cpu) show cpu infomation

mem) show memory infomation

*) quit

1、如果用户选择了cpu,则显示/proc/cpuinfo文件的内容;

2、如果用户选择了mem,则显示/proc/meminfo文件的内容;

3、退出

blob.png

blob.png

或者

blob.png

blob.png

生成菜单第二种方法更易用

字符串中的模式匹配:

=~:模式匹配

用法:[[ "$var" =~ pattern ]]

blob.png

例如:让用户给定一个用户名,判断其是否拥有可登录shell;

blob.png

blob.png

blob.png

练习:写一个脚本,完成如下功能

使用格式:

script.sh  /path/to/somefile

1、可接受一个文件路径参数:

如果此文件不存在,则创建之,则自动为其生成前n行类似如下:

#!/bin/bash

# description:

# version:

# date:

# author: mageedu

# license: GPL

而后使用vim打开此文件,并让光标处在最后一行的行首

如果文件存在、且是bash脚本,则使用vim打开之,光标自动处行最后一行的行首;

否则,退出;

如果正常编辑保存,

判断,如果文件没有执行权限,则添加之;

判断,其是否有语法错误,如果有,提示;

while和until循环:

for循环劣势:

    1、先要在内存中生成列表,如果列表很大,就很占内存

    2、循环次数不定,无法适合这种场景

while适用于循环次数位置或不便用for直接生成较大的列表时

格式:

1、次数已知

while 测试条件;do

    循环体

done

如果测试条件为真,则进入循环;退出条件为,测试条件为假

declare -i count=1

while $count <= 100;do

    循环体

    let count++

done

until:

until 测试条件;do

    循环体

done

如果测试条件结果为假,则进入循环,退出条件为,测试条件为真

练习:求100以内所有正整数之和

blob.png

blob.png

练习:求100以内所有偶数之和,使用取模方式实现

blob.png

练习:提示用户输入一个用户名,如果用户存在,就显示用户的id号或shell,否则显示用户不存在,显示完成之后不退出,再次重复前面的操作,直到用户输入q或quit为止

blob.png

blob.png

2、

循环高级:

for的第二种使用格式:

for ((初始条件;测试条件;修改表达式));do

    循环体

done

练习:求100以内所有正整数之和

while的实现方式:

#!/bin/bash

declare -i count=1

declare -i sum=0

while [ $count -lt 100 ];do

    let sum+=$count

    let count++

done

echo $sum

for的实现方式:

#!/bin/bash

declare -i sum=0

for ((count=1;$count <= 100;count++));do

    let sum+=$count

done

echo $sum

变量在赋值时都不用加$,在比较时需要加

练习:求100以内所有偶数之和

#!/bin/bash

declare -i sum=0

for ((count=2;$count <= 100;count+=2));do

    let sum+=$count

done

echo $sum

while循环:遍历文本文件

格式:

while read i;do

    echo $i

done < file

练习:显示id号为偶数的用户的用户名、id、shell

blob.png

blob.png

练习:显示id号为偶数,且id号同gid的用户的用户名、id、shell

blob.png

blob.png

练习:显示当前系统上所有挂载的文件系统中空间使用百分比大于10的文件系统

bash编程至case

写一个脚本,使用格式:

1、start:创建/var/lock/subsys/script.sh

2、stop:删除此文件

3、restart:先删除文件,再创建文件

4、status:如果文件存在,显示running,否则显示stopped

blob.png

blob.png

blob.png

blob.png

case语句:有多个测试条件时,case语句会使得语法结构更明晰

case 变量引用 in

pattern1)

    分支1

    ;;

pattern2)

    分支2

    ;;

*)

    分支n

esac

pattern:类同于文件名通配机制,但支持使用|表示或者

a|b:a或b

*:匹配任意长度的任意字符

?:匹配任意单个字符

[]:指定范围内的任意单个字符

练习:用户键入字符后判断其所属的类别

blob.png

blob.png

练习:写一个脚本,对/etc/目录及内部的所有文件打包压缩

1、显示一个菜单,让用户选择使用的压缩工具

xz)xz compress tool

gz)gzip compress tool

bz2)bzip2 compress tool

2、根据用户选择的工具,对/etc/执行相应的操作并保存至/backups目录,文件形如/backups/etc-日期时间.tar.压缩后缀

blob.png

blob.png

blob.png

练习:写一个脚本,使用形式如下

showifinfo.sh [-i interface|-a] [-v]

要求:

1、-i或-a不可同时使用,-i用于指定特定网卡接口,-a用于指定所有接口

显示接口的ip地址

2、使用-v,则表示显示详细信息

显示接口的ip地址、子网掩码、广播地址

3、默认表示仅使用-a选项

blob.png

blob.png

blob.png

    

原创文章,作者:黑白子,如若转载,请注明出处:http://www.178linux.com/47622

(0)
黑白子黑白子
上一篇 2016-09-25
下一篇 2016-09-25

相关推荐

  • MySQL存储过程中IN、OUT、INOUT参数使用

    MySQL存储过程中IN、OUT、INOUT参数使用 MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN、OUT、INOUT形式如:CREATE PROCEDURE([IN|OUT|INOUT] 参数名 数据类型,…) IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值。| 意思…

    Linux干货 2017-05-08
  • 马哥教育网络班20期+第3周课程练习

    1、列出当前系统上所有已经登录的用户的用户名。 注意同一个用户登陆多次,只显示一次即可。    w | cut -d ' ' -f 1 | uniq -c       2、取出最后登陆到当前系统的用户的相关信息    last | head -n 1  &nbsp…

    Linux干货 2016-06-26
  • linux启动流程

    linux组成 Linux: kernel+rootfskernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能 rootfs:程序和glibc库:函数集合, function, 调用接口(头文件负责描述)过程调用:procedure,无返回值函数调用:function程序:二进制执行文件 内核设计流派:单内核(monolithic ker…

    2018-01-01
  • 编译安装LAMP及分离式LAMP平台构建

    前言 LAMP网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统,Apache网站服务器,MySQL数据库,Perl、PHP或者Python编程语言,所有组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采取这个架构,和Java/J2EE架构相比,LAMP具有Web资源丰富、轻量、快速开发等特点,与微软的.NET架构相比,L…

    Linux干货 2015-04-20
  • N26 第八周作业

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥(network bridge) 网桥工作于物理层与数据链路层,在终端设备较多的局域网中可以用网桥设备将局域网分离为不同的冲突域(collision domain),减少网络冲突,提升网络传输效率 集线器(network hub) 集线器具有多个I/O端口,一个端口的输入信号…

    2017-02-25
  • N22-第八周作业

    第八周 1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。      集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。它工作于OSI(开放系统互联参考模型)参考模型第一层,即“物理层”。    &n…

    Linux干货 2016-10-09