6.4bash条件测试

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

            若是正常编辑保存,
                判断,若是文件没有执行权限,则添加之;

                判断,其是否有语法错误,若是有,提示;

相关文章
相关标签/搜索