shell-2
檔案目錄屬性判斷
在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"
;;
4)
echo "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]#