shell if 语句格式.docx
- 文档编号:3753795
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:10
- 大小:18.63KB
shell if 语句格式.docx
《shell if 语句格式.docx》由会员分享,可在线阅读,更多相关《shell if 语句格式.docx(10页珍藏版)》请在冰豆网上搜索。
shellif语句格式
if语句格式
if 条件
then
Command
else
Command
fi 别忘了这个结尾
If语句忘了结尾fi
test.sh:
line14:
syntaxerror:
unexpectedendoffi
if的三种条件表达式
if
command
then
if
函数
then
命令执行成功,等于返回0(比如grep,找到匹配)
执行失败,返回非0(grep,没找到匹配)
if[expression_r_r_r ]
then
表达式结果为真,则返回0,if把0值引向then
iftestexpression_r_r_r
then
表达式结果为假,则返回非0,if把非0值引向then
[]&& ——快捷if
[-f"/etc/shadow"]&&echo"Thiscomputerusesshadowpasswors"
&&可以理解为then
如果左边的表达式为真则执行右边的语句
shell的if与c语言if的功能上的区别
shellif
c语言if
0为真,走then
正好相反,非0走then
不支持整数变量直接if
必须:
if[i–ne0]
但支持字符串变量直接if
if[str]如果字符串非0
支持变量直接if
if(i)
以多条command或者函数作为if条件
echo–n“input:
”
readuser
if
多条指令,这些命令之间相当于“and”(与)
grep$user/etc/passwd>/tmp/null
who-u|grep$user
then 上边的指令都执行成功,返回值$?
为0,0为真,运行then
echo"$userhaslogged"
else 指令执行失败,$?
为1,运行else
echo"$userhasnotlogged"
fi
#shtest.sh
input:
root
root pts/0 May1515:
55 . 2075(192.168.1.100)
macghaslogged
#shtest.sh
input:
ddd
dddhasnotlogged
以函数作为if条件 (函数就相当于command,函数的优点是其return值可以自定义)
if
以函数作为if条件,
getyn
then 函数reture值0为真,走then
echo"youranswerisyes"
else 函数return值非0为假,走else
echo"youranserisno"
fi
ifcommand 等价于command+if$?
$vitestsh.sh
#!
/bin/sh
if
cat111-tmp.txt|grepting1
then
echofound
else
echo"nofound"
fi
$vitestsh.sh
#!
/bin/sh
cat111-tmp.txt|grepting1
if[$?
-eq0]
then
echo$?
echofound
else
echo$?
echo"nofound"
fi
$shtestsh.sh
nofound
$shtestsh.sh
1
nofound
$vi111-tmp.txt
thatis222file
thisting1is111file
$shtestsh.sh
thisting1is111file
found
$vi111-tmp.txt
thatis222file
thisting1is111file
$shtestsh.sh
thisting1is111file
0
found
========================================以条件表达式作为if条件=============================
传统if从句子——以条件表达式作为if条件
if[条件表达式]
then
command
command
command
else
command
command
fi
条件表达式
∙文件表达式
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
字符串允许使用赋值号做等号
if [$string1!
= $string2] 如果string1不等于string2
if [-n$string ] 如果string非空(非0),返回0(true)
if [-z$string ] 如果string为空
if [$sting] 如果string非空,返回0(和-n类似)
条件表达式引用变量要带$
if[a=b];then
echoequal
else
echonoequal
fi
[macg@machome~]$shtest.sh
inputa:
5
inputb:
5
noequal (等于表达式没比较$a和$b,而是比较和a和b,自然a!
=b)
改正:
if[$a=$b];then
echoequal
else
echonoequal
fi
[macg@machome~]$shtest.sh
inputa:
5
inputb:
5
equal
-eq -ne -lt -nt只能用于整数,不适用于字符串,字符串等于用赋值号=
[macg@machome~]$vitest.sh
echo-n"inputyourchoice:
"
readvar
if [$var-eq"yes"]
then
echo$var
fi
[macg@machome~]$sh-xtest.sh
inputyourchoice:
y
test.sh:
line3:
test:
y:
integerexpression_r_r_rexpected
期望整数形式,即-eq不支持字符串
=放在别的地方是赋值,放在if[]里就是字符串等于,shell里面没有==的,那是c语言的等于
无空格的字符串,可以加"",也可以不加
[macg@machome~]$vitest.sh
echo"inputa:
"
reada
echo"inputis$a"
if[$a=123];then
echoequal123
fi
[macg@machome~]$shtest.sh
inputa:
123
inputis123
equal123
=作为等于时,其两边都必须加空格,否则失效
等号也是操作符,必须和其他变量,关键字,用空格格开(等号做赋值号时正好相反,两边不能有空格)
[macg@machome~]$vitest.sh
echo"inputyourchoice:
"
readvar
if[ $var="yes" ]
then
echo$var
echo"inputiscorrect"
else
echo$var
echo"inputerror"
fi
[macg@machome~]$vitest.sh
echo"inputyourchoice:
"
readvar
if[ $var="yes" ] 在等号两边加空格
then
echo$var
echo"inputiscorrect"
else
echo$var
echo"inputerror"
fi
[macg@machome~]$shtest.sh
inputyourchoice:
y
y
inputiscorrect
[macg@machome~]$shtest.sh
inputyourchoice:
n
n
inputiscorrect
输错了也走then,都走then,为什么?
因为if把$var="yes"连读成一个变量,
而此变量为空,返回1,则走else
[macg@machome~]$shtest.sh
inputyourchoice:
y
y
inputerror
[macg@machome~]$shtest.sh
inputyourchoice:
no
no
inputerror
一切正常
If [ $ANS ] 等价于 if[-n$ANS]
如果字符串变量非空(then),空(else)
echo"inputyourchoice:
"
readANS
if[$ANS]
then
echonoempty
else
echoempth
fi
[macg@machome~]$shtest.sh
inputyourchoice:
回车
empth 说明“回车”就是空串
[macg@machome~]$shtest.sh
inputyourchoice:
34
noempty
整数条件表达式,大于,小于,shell里没有>和<,会被当作尖括号,只有-ge,-gt,-le,lt
[macg@machome~]$vitest.sh
echo"inputa:
"
reada
if [$a-ge100];then
echo3bit
else
echo2bit
fi
[macg@machome~]$shtest.sh
inputa:
123
3bit
[macg@machome~]$shtest.sh
inputa:
20
2bit
整数操作符号-ge,-gt,-le,-lt,别忘了加-
if test$a ge 100;then
[macg@machome~]$shtest.sh
test.sh:
line4:
test:
ge:
binaryoperatorexpected
if test$a-ge100;then
[macg@machome~]$shtest.sh
inputa:
123
3bit
============================逻辑表达式=========================================
逻辑非!
条件表达式的相反
if[!
表达式]
if[!
-d$num] 如果不存在目录$num
逻辑与–a 条件表达式的并列
if[表达式1 –a 表达式2]
逻辑或-o 条件表达式的或
if[表达式1 –o表达式2]
逻辑表达式
∙ 表达式与前面的= !
=-d–f–x-ne-eq-lt等合用
∙ 逻辑符号就正常的接其他表达式,没有任何括号(),就是并列
if[-z"$JHHOME"-a-d$HOME/$num]
∙ 注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了
最常见的赋值形式,赋值前对=两边的变量都进行评测
左边测变量是否为空,右边测目录(值)是否存在(值是否有效)
[macg@mac-home~]$vitest.sh
:
echo"inputthenum:
"
readnum
echo"inputis$num"
if[-z"$JHHOME"-a-d$HOME/$num] 如果变量$JHHOME为空,且$HOME/$num目录存在
then
JHHOME=$HOME/$num 则赋值
fi
echo"JHHOMEis$JHHOME"
-----------------------
[macg@mac-home~]$shtest.sh
inputthenum:
ppp
inputisppp
JHHOMEis
目录-d$HOME/$num 不存在,所以$JHHOME没被then赋值
[macg@mac-home~]$mkdirppp
[macg@mac-home~]$shtest.sh
inputthenum:
ppp
inputisppp
JHHOMEis/home/macg/ppp
一个-o的例子,其中却揭示了”=”必须两边留空格的问题
echo"inputyourchoice:
"
readANS
if[ $ANS="Yes" -o$ANS="yes"-o$ANS="y"-o$ANS="Y"]
then
ANS="y"
else
ANS="n"
fi
echo$ANS
[macg@machome~]$shtest.sh
inputyourchoice:
n
y
[macg@machome~]$shtest.sh
inputyourchoice:
no
y
为什么输入不是yes,结果仍是y(走then)
因为=被连读了,成了变量$ANS="Yes",而变量又为空,所以走else了
[macg@machome~]$vitest.sh
echo"inputyourchoice:
"
readANS echo"inputyourchoice:
"
readANS
if[ $ANS="Yes" -o$ANS="yes"-o$ANS="y"-o$ANS="Y"]
then
ANS="y"
else
ANS="n"
fi
echo$ANS
[macg@machome~]$shtest.sh
inputyourchoice:
no
n
[macg@machome~]$shtest.sh
inputyourchoice:
yes
y
[macg@machome~]$shtest.sh
inputyourchoice:
y
y
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- shell if 语句格式 语句 格式