​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 20:13
下一篇 2016-09-25 23:48

相关推荐

  • 查找 -数据结构

    几种查找算法:顺序查找,折半查找,分块查找,散列表 一、顺序查找的基本思想:  从表的一端开始,向另一端逐个按给定值kx 与关键码进行比较,若找到,查找成功,并给出数据元素在表中的位置;若整个表检测完,仍未找到与kx 相同的关键码,则查找失败,给出失败信息。 说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是查找效…

    Linux干货 2015-07-28
  • Shell脚本编程基础中() (()) [ ] [[ ]] 的使用

    Shell脚本编程基础中() (()) [ ] [[ ]] 的使用 () 生成子进程,括号内的命令将会在子进程中运行,父进程不能够读取在子进程中创建的变量 例: 新建个脚本文件,写入 则执行结果为 $()相当于 ` `  ,返回括号内命令执行结果 (( )) 用作四则运算和逻辑运算,并且支持多个表达式 例: 当 (( )) 加$,则是将获得表达式值,赋值给左…

    2017-11-26
  • ​文件系统层级结构标准

    多数Linux发行版遵从FHS标准并且声明其自身政策以维护FHS的要求。 [1] [2] [3] [4] 然而,包括由自由标准小组成员在内开发的绝大多数发行版(截至2009年),并不完全执行建议的标准。
    当FHS创建之时,其他的UNIX和类Unix操作系统已经有了自己的标准,尤其是hier(7)文件系统布局描述。 自从第七版Unix(于1979年)发布以来已经存在,或是SunOS filesystem(7), [5] 和之后的Solaris filesystem(5)。 例如,Mac OS X使用如 /Library、 /Applications和/Users 等长名与传统UNIX目录层次保持一致。
    现在的Linux发行版包含一个/sys目录作为虚拟文件系统(sysfs,类似于 /proc,一个procfs),它存储且允许修改连接到系统的设备,然而许多传统UNIX和类Unix操作系统使用/sys作为内核代码树的符号链接。
    一些Linux系统如GoboLinux和Syllable Server使用了和FHS完全不同的文件系统层次组织方法。

    Linux干货 2016-10-17
  • SHELL脚本基础速览

    变量的赋值: Shell变量赋值从右到左进进行赋值 格式:NAME=value 变量的声明: export 变量名  export NAME=value declare –x 变量名 declare –x NAME=value   readonly 变量名  特定情况下需要使用到只读变量 readonly NAME=v…

    2017-04-15
  • httpd的特性(初阶应用)

    httpd的特性   httpd常用配置/etc/httpd/conf/httpd.conf 1、修改监听的IP和PORT Listen [IP:]PORT (1)省略IP表示为0.0.0.0 (2)Listen指令可重复多次 Listen 8080 Listen 80 (3)先修改监听的socket,重启服务后方可生效 2、持久连续 KeepAl…

    2017-09-30
  • 第八周作业

    1、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;     在线的主机使用绿色显示;     不在线的主使用红色显示; 2、如何给网络接口配置多个地址,有哪些方式? 方法3:在/etc/sysconfig/netw…

    2017-04-20