shell-2

chunyang315發表於2018-04-19

檔案目錄屬性判斷

  • 在shell中通常會和檔案、目錄打交道,對檔案或者目錄的判斷就非常重要了。

  • if判斷檔案、目錄屬性
    (1)[ -f file ] 判斷是否是普通檔案,且存在。
    2層含義:判斷該檔案是否是普通檔案,判斷是否存在該檔案。

[root@zcy-1 tmp]# vi file1.sh
[root@zcy-1 tmp]# sh -x !$
sh -x file1.sh
+ f=/tmp/123.txt
+ '[' -f /tmp/123.txt ']'
+ touch /tmp/123.txt
[root@zcy-1 tmp]# sh -x file1.sh
+ f=/tmp/123.txt
+ '[' -f /tmp/123.txt ']'
+ echo yaoming
[root@zcy-1 tmp]# cat /tmp/123.txt
yaoming
[root@zcy-1 tmp]# 

(2)[ -d file ] 判斷是否是目錄,且存在

[root@zcy-1 tmp]# cat file2.sh
#!/bin/bash 
f="/tmp/nba" 
if [ -d $f ]
then 
    touch  $f/11.txt 
else 
   mkdir $f  
fi
[root@zcy-1 tmp]# sh -x !$
sh -x file2.sh
+ f=/tmp/nba
+ '[' -d /tmp/nba ']'
+ mkdir /tmp/nba
[root@zcy-1 tmp]# sh -x file2.sh
+ f=/tmp/nba
+ '[' -d /tmp/nba ']'
+ touch /tmp/nba/11.txt
[root@zcy-1 tmp]# ls /tmp/nba/11.txt 
/tmp/nba/11.txt

(3)[ -e file ] 判斷檔案或者目錄是否存在,如果檔案不存在都可以使用touch建立的,如果檔案或者目錄存在會修改它的3個time

f=/tmp/1.txt
if [ -e $f ] 
then 
  echo ok 
else  
  touch $f 
fi 

(4)[ -r file ] 判斷檔案是否可寫,針對的是當前執行指令碼的使用者

這裡寫程式碼片

(5)[ -w file ] 判斷檔案是否可讀

(6)[ -x file ] 判斷檔案是否可執行

(7)shell指令碼中可以使用&&代替then

[ -f $f ] && rm -f $f 


if [ -f $f ]
then 
  rm -f $f
fi

(8) | | 代替 else

f=/tmp/1.txt
[ -f $f ] || touch $f 
//當/tmp/1.txt 檔案不存在時,才會去建立



f=/tmp/1.txt
if [ -f $f ] 
then 
  rm -f $f 
else 
  touch $f 
fi 

  //當檔案存在時,就刪除檔案,當檔案不存在時就建立檔案

(9) 反向判斷

f=/tmp/1.txt
if 
[ ! -f $f ] 
then 
  touch $f 
fi 

使用!就是取反之意


if特殊用法

  • if [ -z “$a” ] 表示當變數a的值為空時會怎麼樣
[root@zcy-1 tmp]# cat if4.sh 
#!/bin/bash
if  [ ! -f /tmp/41233 ]
then 
    echo "/tmp/41233 not exist."
    exit 
fi 
n='wc -l /tmp/41233'
if [ -z "$n" ]
then 
     echo error 
     exit
elif [ $n -gt 100 ] 
then 
    echo ok 
fi 

[root@zcy-1 tmp]# sh -x if4.sh 
+ '[' '!' -f /tmp/41233 ']'
+ echo '/tmp/41233 not exist.'
/tmp/41233 not exist.
+ exit
[root@zcy-1 tmp]# 

這裡判斷檔案不存在時,退出指令碼。也就不用再執行後面的命令了。

  • if [ -n ” $a” ] 表示檔案或者變數a不為空時會怎麼樣
[root@zcy-1 tmp]# cat 123.txt
yaoming
[root@zcy-1 tmp]# if [ -n "123.txt" ] ; then cat "123.txt" ;fi
yaoming
[root@zcy-1 tmp]# echo $b

[root@zcy-1 tmp]# if [ -n "$b" ] ; then echo $b ; else echo " b is null" ; fi 
 b is null
[root@zcy-1 tmp]# 

如果是變數需要用雙引號引起來,如果是檔案則不用雙引號

(3)在邏輯判斷中使用一個命令的結果作為判斷條件

grep -w "mysql" /etc/passwd  //-w表示精準匹配,


[root@zcy-1 tmp]# if grep -wq 'mysql' /etc/passwd ; then echo "mysql exist" ; fi 
mysql exist
//不加選項會列印出匹配的結果
if ! grep -wq "zcy" /ect/passwd ; then useradd zcy ;fi  
表示zcy使用者不存在時就建立該使用者

(4)if (($a<1)) ; then... 等同於 if [ $a -lt 1 ] ; then ...

(5)[ ] 中不能使用< > == != >= <=這樣的符號


case判斷

  • 在shell中還有一種邏輯判斷就做case ,較if fi複雜一些。
  • 格式
case 變數名 in 
      value1)
         command
          ;;
      value2)
         command
           ;; 
        *) 
          command 
          ;; 
        esac                  

當變數為 value1執行哪些,當變數為 value2時又執行哪些,當變數既不是 value1又不是 value2的時候,使用*)裡面的命令。在上面的例子中;; (雙分號)表示value1判斷結束。進入下一個判斷

  • 在case程式中,可以在條件中使用||,表示或的意思,比如
2|3) 
   command 
    ;; 
  • 編寫指令碼測試csae的作用
#!/bin/bash
read -p "Please input a number; " n  //定義變數n的值
if [ -z "$n" ]  //判斷變數是否為空
then
   echo "Please input a number. "
   exit 1  //當一條命令執行完成後,會返回的值
fi


n1=`echo $n|sed 's/[0-9]//g'`
if [ ! -z $n1 ]  //當變數不為空時,繼續輸入數字
then
  echo "Please input a number."
  exit 1
#elif [ $n -lt 0 ] || [ $n -gt 100 ]
#then
# echo "The number range is 0-100."
#  exit 1
fi
if [ $n -lt 60 ]  && [ $n -ge 0 ]
then
    tag=1
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then
    tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ]
then
    tag=3
elif [ $n -ge 90  ] && [ $n -le 100 ]
then
    tag=4
else
    tag=0
fi

case $tag in
  1)
      echo  "not ok "
        ;;
  2)
      echo "ok"
        ;;

  3)
      echo "good"
        ;; 
  4echo "evry good"   
        ;;    
  *)
      echo "The number range is 0-100."
        ;;
esac

(1)read -p

[root@zcy-1 tmp]# read -p "Please input a number; " n
Please input a number; 5
[root@zcy-1 tmp]# echo $n
5
[root@zcy-1 tmp]# 

(2)定義返回的值

[root@zcy-1 tmp]# cat ce.sh
#!/bin/bash
read -p "Please input a number; " n
if [ -z "$n" ]
then
   echo "Please input a number. "
   exit 3
fi

[root@zcy-1 tmp]# sh ce.sh 
Please input a number; 
Please input a number. 
[root@zcy-1 tmp]# echo $?
3
[root@zcy-1 tmp]# 

測試

[root@zcy-1 tmp]# sh -x case.sh 
+ read -p 'Please input a number; ' n
Please input a number; 30
+ '[' -z 30 ']'
++ sed 's/[0-9]//g'
++ echo 30
+ n1=
+ '[' '!' -z ']'
+ '[' 30 -lt 60 ']'
+ '[' 30 -ge 0 ']'
+ tag=1
+ case $tag in
+ echo 'not ok '
not ok 
[root@zcy-1 tmp]# sh -x case.sh 
+ read -p 'Please input a number; ' n
Please input a number; 60
+ '[' -z 60 ']'
++ echo 60
++ sed 's/[0-9]//g'
+ n1=
+ '[' '!' -z ']'
+ '[' 60 -lt 60 ']'
+ '[' 60 -ge 60 ']'
+ '[' 60 -lt 80 ']'
+ tag=2
+ case $tag in
+ echo ok
ok
[root@zcy-1 tmp]# sh -x case.sh 
+ read -p 'Please input a number; ' n
Please input a number; 92
+ '[' -z 92 ']'
++ echo 92
++ sed 's/[0-9]//g'
+ n1=
+ '[' '!' -z ']'
+ '[' 92 -lt 60 ']'
+ '[' 92 -ge 60 ']'
+ '[' 92 -lt 80 ']'
+ '[' 92 -ge 80 ']'
+ '[' 92 -lt 90 ']'
+ '[' 92 -ge 90 ']'
+ '[' 92 -le 100 ']'
+ tag=4
+ case $tag in
+ echo 'evry good'
evry good
[root@zcy-1 tmp]#