一、bash脚本编程

  1、文件测试

    a、存在性测试

      -a FILE

      -e FILE

      文件的存在性测试,存在则为真,不存在则为假

[root@node1 ~]# [ -e /etc/rc.d/rc.sysinit ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# [ -e /etc/rc.d/rc.local ]
[root@node1 ~]# echo $?
0

    b、存在性及类型测试

      -b FILE:是否存在并且为块设备文件

[root@node1 ~]# [ -b /dev/sda ]
[root@node1 ~]# echo $?
0

      -c FILE:是否存在并且为字符设备文件

      -d FILE:是否存在并且为目录文件

      -f FILE:是否存在并且为普通文件

      -h FILE或-L FILE:是否存在并且为符号链接文件

      -p FILE:是否存在且为命名管道文件

      -S FILE:是否存在且为套接字文件

    c、文件权限测试

      -r FILE:是否存在并且对当前用户可读;

      -w FILE:是否存在并且对当前用户可写

      -x FILE:是否存在并且对当前用户可执行

    d、特殊权限测试

      -u FILE:是否存在并且拥有suid权限

      -g FILE:是否存在并且拥有sgid权限

      -k FILE:是否存在并且拥有stlcky权限

    e、文件是否有内容

      -s FILE:文件是否有内容,有则为真,没有则为假

[root@node1 ~]# touch /tmp/testfile
[root@node1 ~]# [ -s /tmp/testfile ]
[root@node1 ~]# echo $?
1
[root@node1 ~]# echo "wohaoshuai" >> /tmp/testfile
[root@node1 ~]# [ -s /tmp/testfile ]
[root@node1 ~]# echo $?
0

    f、对文件的时间戳做测试

      -N FILE:文件自从上一次读操作后是否被修改过

    g、从属关系测试

      -O FILE:当前用户是否为文件的属主

      -G FILE:当前有效用户是否属于文件的属组

    h、双目测试

      FILE1 -ef  FILE2:文件1和文件2是否为指向同一个文件系统上的相同inode的硬链接

      FILE1 -nt FILE2 :FILE1是否新于FILE2

      FILE1 -ot FILE2 :FILE1是否旧于FILE2

  2、组合测试条件

    a、逻辑运算

      第一种方式:

        COMMAND1 && COMMAND2

        COMMAND1 || COMMAND2

        !COMMAND

        [ -O FILE ] && [ -r FILE ]

      第二种方式:

        EXPRESSION1 -a  EXPRESSION2 #与运算

        EXPRESSION -o EXPRESSION2 #或运算

        !EXPRESSION

        [ -O FILE -a -x FILE ]

  3、练习:

    a、将当前主机名称保存至hostName变量中,主机名如果为空,或者为localhost.localdomain,则将其设置为www.wohaoshuai.com;

      hostName=$(hostname)

      [ -z "$hostName" -o "$hostName"=="localhost.localdomain" -o "$hostName"=="localhost" ] && hostname www.wohaoshuai.com

二、如何向脚本传递参数

  1、位置参数变量

    myscript.sh argu1 argu2

    a、引用方式:

      $1,$2,...${10},${11}...

[root@node1 script]# cat sum.sh
#!/bin/bash
#
echo $[$1 + $2]
[root@node1 script]# bash sum.sh 2 3
5

    b、轮替。shift [n]:位置参数轮替。

[root@node1 script]# cat shift.sh
#!/bin/bash
echo "First and second pos argu: $1,$2"
shift 2 #一脚踢掉两个参数,因此下一个参数又会从$1开始,如果不指定默认会踢掉一个
echo "Third pos argu $1"
[root@node1 script]# bash shift.sh one two three
First and second pos argu: one,two
Third pos argu three

    c、练习:写一个脚本,通过命令行传递两个文本文件路径给脚本,计算其空白行数之和

[root@node1 script]# cat lines.sh
#!/bin/bash
file1_lines=$(grep "^$" $1|wc -l)
file2_lines=$(grep "^$" $2|wc -l)

echo "Total blank lines:$[$file1_lines+$file2_lines]"

[root@node1 script]# bash lines.sh /etc/fstab /etc/issue
Total blank lines:2

  2、特殊变量

    $0:脚本文件路径本身

[root@node1 script]# cat filename.sh
#!/bin/bash
echo $0
[root@node1 script]# bash filename.sh
filename.sh

    $#:显示参数个数

[root@node1 script]# cat pos.sh
#!/bin/bash
echo "$1,$2"
echo $#
[root@node1 script]# bash pos.sh wohaoshuai1 wohaoshuai2
wohaoshuai1,wohaoshuai2
2
12-20 00:24
查看更多