一、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