Shell编程入门(第二版)(中)
变量測试语句-test
作用:用来測试变量是否相等,是否为空,文件类型等。
格式:
test 測试条件 或 [] #范围:整数,字符串。文件
1)整数測试:
test int1 -eq int2 測试整数是否相等
test int1 -ge int2 測试int1是否>=int2
test int1 -gt int2 測试int1是否>int2
test int1 -le int2 測试int1是否<=int2
test int1 -lt int2 測试int1是否<int2
test int1 -ne int2 測试整数是否不相等
2)字符串測试:
test str1=str2 測试字符串是否相等
test str1!=str2 測试字符串是否不相等
test str1 測试字符串是否不为空
test -n str1 測试字符串是否不为空
test -z str1 測试字符串是否为空
3)文件測试:
test -d file 指定文件是否文件夹
test -f file 指定文件是否常规文件
test -x file 指定文件是否可运行
test -r file 指定文件是否可读
test -w file 指定文件是否可写
test -a file 指定文件是否存在
test -s file 文件的大小是否非0
注:test測试语句一般不单独使用,一般作为if语句的測试条件,如;
if test -d file then .... fi
test的变量的简写形式”[]”
演示样例-apachtest.sh
#!/bin/bash # A test shell script for test Apache is running or not web=$(/usr/bin/pgrep httpd) echo "Now let's test the Apache..." echo #if [ "$web" != "" ] if [ -n "$web" ] then echo "Apache is running..." else echo "Apache is NOT running..." /etc/rc.d/init.d/httpd start fi
流程控制语句
流控制语句:用于控制shell程序的流程
exit语句:退出程序运行,并返回一个返回码,返回码为0表示正常退出,非0表示非正常退出。
比如:exit 0
一、if
if/then格式
if test -d $1 then ... fi
演示样例-if_then.sh
#!/bin/bash # A test shell script for if/then if [ -x /etc/rc.d/init.d/httpd ] then echo "Script: /etc/rc.d/init.d/httdp have x power!" /etc/rc.d/init.d/httpd restart fi
if/else格式
if 条件1 then 命令1 elif 条件2 then 命令2 else 命令3 fi
多个条件的联合:
-a: 逻辑与,仅当两个条件都成立时,结果为真。
-o: 逻辑或,两个条件仅仅要有一个成立,结果为真。
演示样例-if_else.sh
#!/bin/bash # A test shell script for if/elif/else echo -n "Please input a filename: " read filename if [ -d $filename ] then echo "$filename is a directory" elif [ -f $filename ] then echo "$filename is a commen file" elif [ -c $filename -o -b $filename ] then echo "$filename is a device file" else echo "$filename is a unkown file" fi
演示样例-if_elif_exit.sh
#!/bin/bash # A test shell script for if/elif if [ $# -ne 2 ] then echo "Not enough parameters" exit 1 fi if [ $1 -gt $2 ] then echo "$1 is great then $2" elif [ $1 -lt $2 ] then echo "$1 is little then $2" else echo "$1 is equal as $2" fi
二、for/in
for 变量 in 名字表 do 命令列表 done
演示样例-for.sh
#!/bin/bash # A test shell script for "for" for DAY in Sunday Monday Tuesday Wednesday Thursday Friday Saturday do echo "The day is $DAY" done
awk命令[分段提取]
awk -F域分隔符 ‘命令’[单引號] #假设不用-F指定切割符,默觉得空格
1、检測系统中UID为0的用户
awk -F: '$3==0 {print $1}' /etc/passwd
#awk -F: '{print $1}' /etc/passwd
-F: 指定切割附为:
$3 表示以:为切割附的第三位
2、检測系统中password为空的用户
awk -F: 'length($2)==0 {print $1}' /etc/shadow
#ps aux | grep -v root | awk '{print $2}'
演示样例-awk.sh
#!/bin/bash # A test script for desplay users infomation /bin/echo -n "Please input a username: " read username /bin/grep $username /etc/passwd > /dev/null 2> /dev/null if [ $? -eq 0 ] then /bin/echo "username is: $username" else /bin/echo "user: $username is not exits." exit 1 fi /bin/echo # list /etc/passwd info userinfo=`/bin/grep ^$username:x /etc/passwd` uid=`echo $userinfo | awk -F: '{print $3}'` gid=`echo $userinfo | awk -F: '{print $4'}` dir=`echo $userinfo | awk -F: '{print $6}'` shell=`echo $userinfo | awk -F: '{print $7}'` # get /etc/group info groupinfo=`/bin/grep x:$gid /etc/group` gname=`/bin/echo $groupinfo | awk -F: '{print $1}'` /bin/echo "user id is: $uid" /bin/echo "default group is: $gname" /bin/echo "home directory is: $dir" /bin/echo "shell is: $shell" /bin/echo "group member info:" # get group members groups=`/usr/bin/groups $username` /bin/echo $groups /bin/echo # get online info online=`/usr/bin/who | grep $username` if [ -z "$online" ] then echo "$username is not online" else echo "$username is online..." fi
实例-killuser.sh
#思路:将一个用户全部的进程包含shell都关闭,则相当于将该用户踢出了系统 #!/bin/bash # A shell sript to kill a user in Linux username=$1 killpid=`/bin/ps aux | grep $username | awk '{print $2}'` for PID in $killpid do /bin/kill -9 $PID 2> /dev/null done