一、bash 中如何进行条件测试:

   有三种类型的测试:整数测试、字符串测试、文件测试

   1.整数测试:

             -eq   左边的值是否等于右边

             -gt   左边的值是否大于右边 

             -ge   左边的值是否大于等于右边

             -lt   左边的值是否小于右边

             -le   左边的值是否小于等于右边

             -ne   左边的值是否不等于右边

    2.字符串测试:

               == 也可以写成=      左右两个字符串是否相同

               =                 左右两个字符串是否不同

               -z                   查看字符串是否为空

               -n                   查看字符串是否不为空

    3.文件测试:

                -e     FILE        判断是否为单目操作

                -f     FILE        判断是否为普通文件

                -d     FILE        判断是否为目录

                -h/-l   FILE        判断是否为符号链接文件

                -b     FILE        判断是否为块设备文件

                -c     FILE        判断是否为字符设备文件

                -r      FILE       判断当前所用的文件是否有读权限

                -w     FILE        判断文件是否有写权限

                -x     FILE        判断文件是否有执行权限

二、sed编辑器介绍

  1.sed:(stream editor ,是一个很好用的行编辑器,支持正则表达式的处理,具有如下特点:

 1sed是一个非交互式的编辑器

 2)没有破坏性,不修改源文件,除非使用shell的重定向符来保存结果

 3sed还支持sed脚本

 使用格式:

 (1)1,4 :表示查找范围是1-4行,使用格式:sed‘addr1,addr2s@from@tog/i’

 其中addr1是开始行,addr2是结束行,;s 是替换,@为分隔符,也可以是其他

 字符,但是不能与查找的字符一样,from是查找什么,to 是替换成什么,g是全

 局查找,i 忽略大小写查找

2/pattern/command    sed 也支持模式匹配,

3/pattern1/ ,/pattern2/

    i\  在当前行的上方添加一行或者多行

     a\  在当前行的下方添加一行或者多行

      对模式匹配到的内容取反

     d  删除匹配到的内容 ,如:sed '5d' filename  ,将文件中的第5行删除;sed '5,7d' filename  将文件中的第5-7行删除

     

2.sed 的一些常用选项

      -n  静默模式,只显示被模式匹配到的内容

      -e  一次指定多个条件 ,例如:sed  -e ‘’  ‘’  ‘’  文件名

      -i   可以直接修改原文件

      -f   读取sed 脚本

3.sed用法的简单例子:

echo "var/log/httpd/access_log/" | sed 's@.*/\([^/]\{1,\}\)/\{0,1\}@\1@g'

显示结果:access_log

echo "/etc/log/httpd/access_log" | sed '1,$s@\(.*\)/[^/]\{1,\}@\1@g'

显示结果:/etc/log/httpd

三、Shell 脚本编程范例:

1.写一个脚本:

(1)创建目录/tmp/scripts

(2)切换工作目录至此目录中

(3)复制/etc/pam.d目录至当前目录,并重命名为test

(4)将当前目录中的test及其里面的文件和子目录的属主改为redhat

(5)test及其子目录中的文件的其他用户的权限改为没有任何权限

#!/bin/bash

WDIR='/tmp/scripts'

mkdir $WDIR &> /dev/null

cd $WDIR

cp -r /etc/pam.d test &> /dev/null

chown -R redhat test &> /dev/null

chmod -R o= test &> /dev/null

2.写一个脚本:

(1).切换工作目录至/var             

(2).依次向/var目录中的每个文件或者子目录问好

1种方法

#!/bin/bash

echo "lian xi "

cd /var

echo "qie huan mulu chenggong "

for file in `ls /var`; do

    echo "hello,$file" | cut -d/ -f1,3

done

2种方法

#!/bin/bash

echo "lian xi "

cd /var

echo "qie huan mulu chenggong "

for file in /var/*; do

    echo "hello,`basename $file`"

done

3.100以内的整数的和:

#!/bin/bash

   declare -i SUM=0

   for I in {1..100}; do

   SUM=$[$SUM+$I]

done

  echo "the sum is:$SUM"

4.100以内偶数的和;

#!/bin/bash

   declare -i SUM=0

   for I in `seq 0 2 100`; do

   SUM=$[$SUM+$I]

done

  echo "the sum is:$SUM"

5.写一个脚本:

(1)设定变量FILE的值为/etc/passwd

(2)使用循环读取文件/etc/passwd 的第2,4,6,10,13,15行,并显示其内容:

(3)把这些行保存至/tmp/mypasswd文件中

#!/bin/bash

FILE='/etc/passwd'

for LINE in 2 4 6 10 13 15; do

  head -$LINE $FILE | tail -1 | tee -a /tmp/mypasswd

done

6.写一个脚本:

(1)设定变量FILE的值为/etc/passwd

(2)依次向/etc/passwd中的每个用户问好,形如:Helloroot,显示自己的shell

形如:your shell bash

(3)统计一共有多少个用户

第一种方法:

#!/bin/bash

FILE='/etc/passwd'

LINES=`wc -l $FILE | cut -d' ' -f1`

 for LINE in `seq 1 $LINES`; do

  echo "Hello ,`head -$LINE $FILE | tail -1 | cut -d: -f1`, your shell:`head -$LINE $FILE | tail -1 | cut -d: -f7`"

done

也可以这样:

for LINE in `seq 1 $LINES`; do

     MYUSER=`head -$LINE $FILE | tail -1 | cut -d: -f1`

     MYSHELL=`head -$LINE $FILE |tail -1 | cut -d: -f7`

   echo "Hello ,$MYUSER,your shell: $MYSHELL"

7.创建10个用户并为其添加密码,以用户一样的密码

for NEWUSER in {1..10};do

    useradd user$Newuser &> /dev/null

    echo "user$Newuser" | passwd --stdin user$NEwuser &> /dev/null

done