shell编程if条件判断文档格式.docx
《shell编程if条件判断文档格式.docx》由会员分享,可在线阅读,更多相关《shell编程if条件判断文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
shell的if与c语言if的功能上的区别
shellif
c语言if
0为真,走then
正好相反,非0走then
不支持整数变量直接if
必须:
if[i–ne0]
但支持字符串变量直接if
if[str]如果字符串非0
支持变量直接if
if(i)
=================================以command作为if条件===================================
以多条command或者函数作为if条件
echo–n“input:
”
readuser
多条指令,这些命令之间相当于“and”(与)
grep$user/etc/passwd>
/tmp/null
who-u|grep$user
上边的指令都执行成功,返回值$?
为0,0为真,运行then
echo"
$userhaslogged"
else
指令执行失败,$?
为1,运行else
$userhasnotlogged"
#shtest.sh
input:
macg
macg
pts/0
May1515:
55
.
2075(192.168.1.100)
macghaslogged
ddd
dddhasnotlogged
以函数作为if条件
(函数就相当于command,函数的优点是其return值可以自定义)
以函数作为if条件,
getyn
函数reture值0为真,走then
youranswerisyes"
函数return值非0为假,走else
youranserisno"
ifcommand
等价于command+if$?
$vitestsh.sh
#!
/bin/sh
cat111-tmp.txt|grepting1
echofound
nofound"
fi
if[$?
-eq0]
echo$?
$shtestsh.sh
nofound
1
nofound
$vi111-tmp.txt
thatis222file
thisting1is111file
found
========================================以条件表达式作为if条件=============================
传统if从句子——以条件表达式作为if条件
if[条件表达式]
条件表达式
∙文件表达式
if[-f
file]
如果文件存在
if[-d...
]
如果目录存在
if[-sfile
如果文件存在且非空
if[-rfile
如果文件存在且可读
if[-wfile
]
如果文件存在且可写
if[-xfile
如果文件存在且可执行
∙整数变量表达式
if[int1-eqint2]
如果int1等于int2
if[int1-neint2]
如果不等于
if[int1-geint2]
如果>
=
if[int1-gtint2]
if[int1-leint2]
如果<
if[int1-ltint2]
∙
字符串变量表达式
If
[$a=$b]
如果string1等于string2
字符串允许使用赋值号做等号
[$string1!
=
$string2]
如果string1不等于string2
[-n$string
如果string非空(非0),返回0(true)
[-z$string
如果string为空
[$sting]
如果string非空,返回0(和-n类似)
条件表达式引用变量要带$
if[a=b];
echoequal
echonoequal
[macg@machome~]$shtest.sh
inputa:
5
inputb:
noequal
(等于表达式没比较$a和$b,而是比较和a和b,自然a!
=b)
改正:
if[$a=$b];
equal
-eq
-ne
-lt
-nt只能用于整数,不适用于字符串,字符串等于用赋值号=
[macg@machome~]$vitest.sh
echo-n"
inputyourchoice:
"
readvar
[$var-eq"
yes"
]
echo$var
[macg@machome~]$sh-xtest.sh
y
line3:
test:
y:
integerexpression_r_r_rexpected
期望整数形式,即-eq不支持字符串
=放在别的地方是赋值,放在if[]里就是字符串等于,shell里面没有==的,那是c语言的等于
无空格的字符串,可以加"
"
也可以不加
reada
inputis$a"
if[$a=123];
then
echoequal123
123
inputis123
equal123
=作为等于时,其两边都必须加空格,否则失效
等号也是操作符,必须和其他变量,关键字,用空格格开(等号做赋值号时正好相反,两边不能有空格)
if[
$var="
inputiscorrect"
inputerror"
$var="
在等号两边加空格
inputiscorrect
n
n
inputiscorrect
输错了也走then,都走then,为什么?
因为if把$var="
连读成一个变量,而此变量为空,返回1,则走else
inputerror
no
no
一切正常
[
$ANS
等价于
if[-n$ANS]
如果字符串变量非空(then),空(else)
readANS
if[$ANS]
echonoempty
echoempth
回车
empth
说明“回车”就是空串
34
noempty
整数条件表达式,大于,小于,shell里没有>
和<
会被当作尖括号,只有-ge,-gt,-le,lt
[$a-ge100];
echo3bit
echo2bit
3bit
20
2bit
整数操作符号-ge,-gt,-le,-lt,别忘了加-
test$a
ge
100;
line4:
ge:
binaryoperatorexpected
test$a-ge100;
============================逻辑表达式=========================================
逻辑非!
条件表达式的相反
if[!
表达式]
-d$num]
如果不存在目录$num
逻辑与–a
条件表达式的并列
if[表达式1
–a
表达式2]
逻辑或-o
条件表达式的或
–o表达式2]
逻辑表达式
表达式与前面的=
!
=-d–f–x-ne-eq-lt等合用
逻辑符号就正常的接其他表达式,没有任何括号(),就是并列
if[-z"
$JHHOME"
-a-d$HOME/$num]
注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了
最常见的赋值形式,赋值前对=两边的变量都进行评测
左边测变量是否为空,右边测目录(值)是否存在(值是否有效)
[macg@mac-home~]$vitest.sh
:
inputthenum:
readnum
inputis$num"
-a-d$HOME/$num]
如果变量$JHHOME为空,且$HOME/$num目录存在
JHHOME=$HOME/$num
则赋值
JHHOMEis$JHHOME"
-----------------------
[macg@mac-home~]$shtest.sh
ppp
inputisppp
JHHOMEis
目录-d$HOME/$num
不存在,所以$JHHOME没被then赋值
[macg@mac-home~]$mkdirppp
JHHOMEis/home/macg/ppp
一个-o的例子,其中却揭示了”=”必须两边留空格的问题
$ANS="
Yes"
-o$ANS="
-o$ANS="
y"
Y"
ANS="
n"
echo$ANS
为什么输入不是yes,结果仍是y(走then)
因为=被连读了,成了变量$ANS="
,而变量又为空,所以走else了
readANS
$ANS="
-o$ANS="
-o$ANS="
yes
===================以
test条件表达式作为if条件===================================
iftest$num-eq0
if[$num–eq0]
test
表达式,没有[
tryagain"
good"
mantest
[macg@machome~]$mantest
[
(1)
UserCommands
[
(1)
SYNOPSIS
testEXPRESSION
[EXPRESSION]
[-n]STRING
thelengthofSTRINGisnonzero
-n和直接$str都是非0条件
-zSTRING
thelengthofSTRINGiszero
STRING1=STRING2
thestringsareequal
STRING1!
=STRING2
thestringsarenotequal
INTEGER1-eqINTEGER2
INTEGER1isequaltoINTEGER2
INTEGER1-geINTEGER2
INTEGER1isgreaterthanorequaltoINTEGER2
INTEGER1-gtINTEGER2
INTEGER1isgreaterthanINTEGER2
INTEGER1-leINTEGER2
INTEGER1islessthanorequaltoINTEGER2
INTEGER1-ltINTEGER2
INTEGER1islessthanINTEGER2
INTEGER1-neINTEGER2
INTEGER1isnotequaltoINTEGER2
FILE1-ntFILE2
FILE1isnewer(modificationdate)thanFILE2
FILE1-otFILE2
FILE1isolderthanFILE2
-bFILE
FILEexistsandisblockspecial
-cFILE
FILEexistsandischaracterspecial
-dFILE
FILEexistsandisadirectory
-eFILE
FILEexists
文件存在
-fFILE
FILEexistsandisaregularfile
文件存在且是普通文件
-hFILE
FILEexistsandisasymboliclink(sameas-L)
-LFILE
FILEexistsandisasymboliclink(sameas-h)
-GFILE
FILEexistsandisownedbytheeffectivegroupID
-OFILE
FILEexistsandisownedbytheeffectiveuserID
-pFILE
FILEexistsandisanamedpipe
-sFILE
FILEexistsandhasasizegreaterthanzero
-SFILE
FILEexistsandisasocket
-wFILE
FILEexistsandiswritable
-x