bash条件测试之文件测试:linux
-a FILE 文件存在
-e FILE: 文件存在则为真;不然则为假;shell
-f FILE: 文件存在而且为普通文件,则为真;不然为假;
-d FILE: 文件存在而且为目录文件,则为真;不然为假;
-L/-h FILE: 文件存在而且为符号连接文件,则为真;不然为假;
-b: 块设备
-c: 字符设备
-S: 套接字文件
-p: 命名管道编程
-s FILE: 文件存在而且为非空文件则为真,不然为假;vim
-r FILE
-w FILE
-x FILEcentos
file1 -nt file2: file1的mtime新于file2则为真,不然为假;
file1 -ot file2:file1的mtime旧于file2则为真,不然为假;bash
例如:若是wget命令对应的可执行文件存在且可执行,则使用它下载http://172.16.0.1/centos6.5.repo至当前目录中;测试
#!/bin/bash
#
downURL='http://172.16.0.1/centos6.5.repo'
downloader=`which wget`ui
if [ -x $downloader ]; then
$downloader $downURL
fi
注意:
-----------------------------------------------------------------
这里是须要注意文件判断的顺序的,要 先 判断是链接文件在判断是 普通文件
-----------------------------------------------------------------
练习:给定一个文件路径
一、判断此文件是否存在;不存在,则说明文件不存,并直接结束脚本;
二、若是文件是否普通文件,则显示为“regular file”;
若是文件是目录,则显示为“directory”;
若是文件是连接文件,则显示为“Symbolic file";
不然,则显示为“unknown type.”rest
#!/bin/bash
#
if [ ! -e $1 ]; then
echo "file not exist."
exit 8
fiip
if [ -L $1 ]; then
echo "Symbolic file"
elif [ -d $1 ]; then
echo "Directory"
elif [ -f $1 ]; then
echo "regular file."
else
echo "unknown."
fi
练习:写一个脚本,完成以下任务:
一、分别复制/var/log下的文件至/tmp/logs/目录中;
二、复制目录时,才使用cp -r
三、复制文件时,使用cp
四、复制连接文件,使用cp -d
五、余下的类型,使用cp -a
注意:
1.比较/var/log下的文件时,不能 -d|-f|-L $filename这样比较,还有目录头呢,切记不要忘了/var/log
应该 /var/log/$filename 在比较别的目录时,必定不能忘记目录头,不然必定会出错
-----------------------------------------------------
[root@linux_basic scripts]#cat filecopy.sh
#!/bin/bash
#
srcdir="/var/log"
#if [ ! -d /var/logs ];then
#if [ ! -e /var/logs ];then
if [ ! -e /tmp/logs ];then
mkdir -p /tmp/logs
# destdir="/tmp/logs/"
destdir="/tmp/logs"
fi
for file in $(ls $srcdir);do
if [ -d $srcdir/$file ];then
cp -r $srcdir/$file $destdir
elif [ -L $srcdir/$file ];then
cp -d $srcdir/$file $destdir
elif [ -f $srcdir/$file ];then
cp $srcdir/$file $destdir
else
cp -a $srcdir/$file $destdir
fi
done
------------------------------------------------------
写一个脚本,完成以下任务,其使用形式以下所示:
script.sh {start|stop|restart|status}
其中:
若是参数为空,则显示帮助信息,并退出脚本;
若是参数为start,则建立空文件/var/lock/subsys/script,并显示“starting script successfully.”
若是参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script successfully.”
若是参数为restart,则删除文件/var/locksubsys/script并从新建立,然后显示“Restarting script successfully.”
若是参数为status,那么:
若是文件/var/lock/subsys/script存在,则显示“Script is running...”,不然,则显示“Script is stopped.”
说明:script.sh是脚本文件名,在建立时,其名称能够本身随意定义,但若是其名称发生变化,在/var/lock/sussys/下的文件名也要随之而变;
-----------------------------------------------------------
[root@linux_basic scripts]#cat service.sh
#!/bin/bash
#
if [ -z "$1" ];then
echo "Usage:$(basename $0) {start|stop|restart|status}"
exit 1
elif [ "$1" == "start" ];then
touch /var/lock/subsys/$(basename $0)
echo "starting $(basename $0) successful."
elif [ "$1" == "stop" ];then
rm -f /var/lock/subsys/$(basename $0)
echo "stop $(basename $0) successful"
elif [ "$1" == "restart" ];then
rm -f /var/lock/subsys/$(basename $0)
touch /var/lock/subsys/$(basename $0)
echo "Rstarting $(basename $0) successful"
elif [ "$1" == "status" ];then
if [ -e /var/lock/subsys/$(basename $0) ];then
echo "$(basename $0) is runing..."
else
echo "$(basename $0) is stopped"
fi
fi
[root@linux_basic scripts]#bash -n service.sh
[root@linux_basic scripts]#chmod +x service.sh
[root@linux_basic scripts]#bash -x ./service.sh
+ '[' -z '' ']'
++ basename ./service.sh
+ echo 'Usage:service.sh {start|stop|restart|status}'
Usage:service.sh {start|stop|restart|status}
+ exit 1
[root@linux_basic scripts]#bash -x ./service.sh start
+ '[' -z start ']'
+ '[' start == start ']'
++ basename ./service.sh
+ touch /var/lock/subsys/service.sh
++ basename ./service.sh
+ echo 'starting service.sh successful.'
starting service.sh successful.
[root@linux_basic scripts]#bash -x ./service.sh stop
+ '[' -z stop ']'
+ '[' stop == start ']'
+ '[' stop == stop ']'
++ basename ./service.sh
+ rm -f /var/lock/subsys/service.sh
++ basename ./service.sh
+ echo 'stop service.sh successful'
stop service.sh successful
[root@linux_basic scripts]#bash -x ./service.sh restart
+ '[' -z restart ']'
+ '[' restart == start ']'
+ '[' restart == stop ']'
+ '[' restart == restart ']'
++ basename ./service.sh
+ rm -f /var/lock/subsys/service.sh
++ basename ./service.sh
+ touch /var/lock/subsys/service.sh
++ basename ./service.sh
+ echo 'Rstarting service.sh successful'
Rstarting service.sh successful
[root@linux_basic scripts]#bash -x ./service.sh status
+ '[' -z status ']'
+ '[' status == start ']'
+ '[' status == stop ']'
+ '[' status == restart ']'
+ '[' status == status ']'
++ basename ./service.sh
+ '[' -e /var/lock/subsys/service.sh ']'
++ basename ./service.sh
+ echo 'service.sh is runing...'
service.sh is runing...
----------------------------------------------------------------
bash编程之交互编程 随着用户的输入而改变
read
-p "prompt" 显示prompt后等待输入
-t timeout 等待t秒后不输入则退出
[root@linux_basic scripts]#read a
hello
[root@linux_basic scripts]#echo $a
hello
[root@linux_basic scripts]#read a b
hello
[root@linux_basic scripts]#echo $a
hello
[root@linux_basic scripts]#echo $b
[root@linux_basic scripts]#read a b c
12 25 69 30
[root@linux_basic scripts]#echo $a
12
[root@linux_basic scripts]#echo $b
25
[root@linux_basic scripts]#echo $c
69 30
例如:输入用户名,可返回其shell
#!/bin/bash
#
read -p "Plz input a username: " userName
if id $userName &> /dev/null; then
echo "The shell of $userName is `grep "^$userName\>" /etc/passwd | cut -d: -f7`."
else
echo "No such user. stupid."
fi
例子:显示一个以下菜单给用户:
cpu) show cpu infomation
mem) show memory infomation
*) quit
一、若是用户选择了cpu,则显示/proc/cpuinfo文件的内容;
二、若是用户选择了mem,则显示/proc/meminfo文件的内容;
三、退出
#!/bin/bash
#
echo "---------menu----------"
echo "cpu) show cpu infomation"
echo "mem) show memory infomation"
echo "*) quit"
echo "-------menu------------"
read -p "Plz give your choice: " choice
if [ "$choice" == 'cpu' ]; then
cat /proc/cpuinfo
elif [ "$choice" == 'mem' ]; then
cat /proc/meminfo
else
echo "Quit"
exit 3
fi
#!/bin/bash
#
cat << EOF
-------menu------------
cpu) show cpu infomation
mem) show memory infomation
*) quit
-------menu------------
EOF
read -p "Plz give your choice: " choice
if [ "$choice" == 'cpu' ]; then
cat /proc/cpuinfo
elif [ "$choice" == 'mem' ]; then
cat /proc/meminfo
else
echo "Quit"
exit 3
fi
字串测试中的模式匹配
[[ "$var" =~ PATTERN ]] 判断$var是否和 PATTERN模式相同
例如:让用户给定一个用户名,判断其是否拥有可登陆shell;
/bin/sh, /bin/bash, /bin/zsh, /bin/tcsh, /sbin/nologin, /sbin/shutdown
#!/bin/bash
#
read -p "Plz input a username: " userName
userInfo=`grep "^$userName\>" /etc/passwd`
if [[ "$userInfo" =~ /bin/.*sh$ ]]; then
echo "can login"
else
echo "cannot login"
fi
练习:写一个脚本,完成以下功能
使用格式:
script.sh /path/to/somefile
vim + FILENAME 打开文件,而且处于文件最后一行行首
一、可接受一个文件路径参数:
若是此文件不存在,则建立之,则自动为其生成前n行相似以下:
#!/bin/bash
# description:
# version:
# date:
# author: mageedu
# license: GPL
然后使用vim打开此文件,并让光标处在最后一行的行首
若是文件存在、且是bash脚本,则使用vim打开之,光标自动处行最后一行的行首;
不然,退出;
---------------------------------------------------------------
[root@linux_basic scripts]#cat createfile.sh
#!/bin/bash
#
if [ -z $1 ];then
echo "Usage:$(basename $0) FILENAME"
exit 1
fi
if [ ! -e "$1" ];then
touch $1
cat > $1 << EOF
#!/bin/bash
# description:
# version:
# date:
# author: magedu
# license: GPL
EOF
vim + $1
#elif [ -e "$1" -a "$(file $1 | grep -o "shell script"&>/dev/null)" ];then
在这种状况下"$(file $1 | grep -o "shell script"&>/dev/null)"是有问题的,由于咱们要的是执行状态值,而不
是执行结果,执行结果也是为空的
elif [ -e "$1" ] && $(file $1 | grep -o "shell script"&>/dev/null);then
vim + $1
else
echo "quit..."
exit 1
fi
---------------------------------------------------------------------
若是正常编辑保存,
判断,若是文件没有执行权限,则添加之;
判断,其是否有语法错误,若是有,提示;