一、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
[root@localhost script]# cat lines.sh #!/bin/bash [ $# -lt 2 ] && echo "At least two file" && exit 1 file1_lines=$(grep "^$" $1|wc -l) file2_lines=$(grep "^$" $2|wc -l) echo "Total blank lines:$[$file1_lines+$file2_lines]" [root@localhost script]# bash lines.sh /etc/fstab At least two file [root@localhost script]# echo $? 1
$*:所有参数
"hello" "hi" "toyou"
$@:所有参数
"hello hi toyou"
[root@node1 script]# cat pos.sh #!/bin/bash echo "$1,$2" echo $# echo $* echo $@ [root@node1 script]# bash pos.sh wohaoshuai1 wohaoshuai2 wohaoshuai1,wohaoshuai2 2 wohaoshuai1 wohaoshuai2 wohaoshuai1 wohaoshuai2
三、条件判断
1、过程式编程语言的代码执行顺序
a、顺序执行:逐条运行
b、选择执行:
代码有一个分支:条件满足时才会执行
两个或以上的分支:只会执行其中一个满足条件的分支
c、循环执行:
代码片段(循环体)要执行0、1或多个来回
2、相应写法
a、选择执行
(1)、单分支的if语句:
if 测试条件;then
分支
fi
(2)、双分支的if语句:
if 测试条件; then
条件为真实执行的分支
else
条件为假时执行的分支
fi
示例:通过参数传递一个用户名给脚本,此用户不存在时,则添加之
[root@localhost script]# cat useradd.sh #!/bin/bash if ! grep "^$1>" /etc/passwd &> /dev/null;then useradd $1 echo $1 |passwd --stdin $1 &> /dev/null echo "Add user $1 finished." fi [root@localhost script]# bash useradd.sh hbase Add user hbase finished.
[root@localhost script]# cat useradd.sh #!/bin/bash if [ $# -lt 1 ];then echo "At least one username." exit 2 fi if ! grep "^$1>" /etc/passwd &> /dev/null;then useradd $1 echo $1 |passwd --stdin $1 &> /dev/null echo "Add user $1 finished." fi [root@localhost script]# bash useradd.sh At least one username. [root@localhost script]# echo $? 2
[root@localhost script]# cat useradd.sh #!/bin/bash if [ $# -lt 1 ];then echo "At least one username." exit 2 fi if grep "^$1>" /etc/passwd &> /dev/null;then echo "User $1 exists" else useradd $1 echo $1 |passwd --stdin $1 &> /dev/null echo "Add user $1 finished." fi [root@localhost script]# bash useradd.sh hbase User hbase exists
3、练习
a、通过命令行参数给定两个数字,输出其中较大的数字
[root@localhost script]# cat big.sh #!/bin/bash if [ $# -lt 2 ];then echo "Two intergers" exit 2 fi if [ $1 -ge $2 ];then echo "Max number; $1." else echo "Max number; $2." fi [root@localhost script]# chmod +x big.sh [root@localhost script]# ./big.sh 4 6 Max number; 6. [root@localhost script]# ./big.sh 4 Two intergers
[root@localhost script]# cat big.sh #!/bin/bash declare -i max if [ $# -lt 2 ]; then echo "Two intergers" exit 2 fi if [ $1 -ge $2 ];then max=$1 else max=$2 fi echo $max [root@localhost script]# bash big.sh 4 6 6
b、通过命令行参数给定一个用户名,判断其ID号是偶数还是奇数
c、通过命令行参数给定两个文件名,如果某文件不存在,则结束脚本执行;都存在时返回每个文件的行数,并说明其中行数较多的文件;