本文主要介绍linux shell中if的各种判断,有需要的朋友可以参考一下。
shell编程中使用到得if语句内判断参数
b当文件存在并且是块文件时,返回true
-c当文件存在并且是字符文件时返回true
-d当pathname存在并且是一个目录时返回true。
-e当pathname指定的文件或目录存在时返回true。
-f当文件存在并且是常规文件时返回true
-g当pathname指定的文件或目录存在并且设置了SGID位时,返回true。
-h当文件存在并且是符号链接文件时返回true。此选项在一些旧系统上无效。
-k当pathname指定的文件或目录存在并且设置了“sticky”位时,返回true。
当文件存在并且是命令管道时,p返回true。
-r当pathname指定的文件或目录存在并且可读时,返回true。
当文件存在且文件大小大于0时,s返回true。
-u当pathname指定的文件或目录存在并且设置了SUID位时,返回true。
-w当pathname指定的文件或目录存在并且可执行时,返回true。目录必须是可执行的,其内容才能被访问。
-o当pathname指定的文件或目录存在,并且由当前进程的有效用户id指定的用户拥有时,返回true。
UNIXShell 里面比较字符写法:
-情商等于
-ne不等于
-gt大于
-它小于
-le小于或等于
-ge大于或等于
-z空字符串
=两个字符相等。
!=两个字符不相等。
-n非空字符串
更为详细的说明:
操作员描述示例
文件比较运算符
如果文件名存在,则-efilename为true[-e/var/log/syslog]
如果文件名是目录[-d /tmp/mydir],则-dfilename为真
如果文件名是常规文件,则-ffilename为true[-f/usr/bin/grep]
-Lfilename如果文件名是符号链接,则为true[-L/usr/bin/grep]
如果文件名可读,则-rfilename为真[-r /var/log/syslog]
如果文件名可写,则-wfilename为true[-w/var/mytmp . txt]
如果文件名是可执行的,则-xfilename为真[-L /usr/bin/grep]
1-nt文件名1-nt文件名2 1比文件名2新,这是真的[/tmp/install/etc/services-nt/etc/services]
如果文件名1比文件名2旧,则1-otfilename2为真[/boot/bzi mage-o tarch/i386/boot/bzi mage]
字符串比较运算符(请注意引号的使用,这是防止空格干扰代码的好方法)
如果字符串的长度为零,则-zstring为真[-z $myvar]
-字符串
如果字符串长度不为零,则为true[-n $ myvar]
1=string1=string2与string2相同,为真[$myvar=one two three]
string1!=string2如果string1与string2不同,则为true [$myvar!=一二三]
算术比较运算符
1-eq num2等于[3 -eq $mynum]
1-ne num2不等于[3 -ne $mynum]
1-lt num2小于[3 -lt $mynum]
1-lenum2小于或等于[3 -le $mynum]
1-gt num2大于[3 -gt $mynum]
1-genum2大于或等于[3 -ge $mynum]
脚本示例:
#!/bin/bash
#这个脚本打印一条关于你体重的信息,如果你给它你的
#重量以公斤计,高度以厘米计。
如果[!$#==2 ];然后
echo 用法:{ GetProperty(Content)} weight _ in _ kilos length _ in _厘米
出口
船方不负担装货费用
weight={GetProperty(Content)}
高度=$2
idealweight=$[$height- 110]
if[$ weight-le $ ideal weight];然后
你应该多吃一点脂肪。
其他
你应该多吃一点水果。
船方不负担装货费用
#weight.sh 70 150
你应该多吃一点水果。
#weight.sh 70 150 33
用法:/weight.sh体重_公斤长度_厘米
位置{GetProperty(Content)},$2,$N、$ #表示命令行的参数个数,{GetProperty(Content)}表示脚本的名称,
第一个参数代表{GetProperty(Content)},第二个参数代表$2,依此类推。参数总数存在于$ #中。上面的例子显示了如何更改脚本,如果参数少于或多于2个,则打印出一条消息。
执行,并检查情况。
#bash -x tijian.sh 60 170
重量=60
身高=170
理想重量=60
[ 60 -le 60 ]
“你应该多吃一点脂肪。”
你应该多吃一点脂肪。
其中-x用于检查脚本的执行。
if 语句格式
If条件
然后
命令
其他
命令
菲,别忘了这个结局
If语句忘记了结束fi
test.sh:第14行:语法错误:意外的fi结尾
if的三种条件表达式
如果
命令
然后
如果
功能
然后
命令的成功执行等于返回0(如grep,如果找到匹配)。
执行失败,返回非0(grep,未找到匹配)
if[ expression_r_r_r ]
然后
如果表达式为真,将返回0,如果将0的值引导到then。
iftest表达式_r_r_r
然后
如果表达式为false,它将返回非零值,如果将非零值引导到then。
[] 3354快速if
[ -f/etc/shadow ] echo 这台计算机使用阴影密码
可以理解为当时
如果左边的表达式为真,则执行右边的语句。
shell的if与c语言if的功能上的区别
Shellif c语言if
0是真的,那就去吧。
反之,则不加0。
不支持整数变量的直接if。
强制:如果[Ine0]
但是它支持字符串变量的直接if。
If [str]如果字符串不为0
支持变量直接if
如果(我)
以command作为if条件
视情况使用多个命令或函数
echon "输入:
readuser
如果
多条指令,相当于“与”
grep$user /etc/passwd /tmp/null
who-u | grep $用户
那么上面的指令都执行成功,返回值是$?0,0为真,则运行。
回显“用户已登录”
Else指令执行失败,$?1,运行else。
回显“用户未登录”
船方不负担装货费用
# shtest.sh
输入:macg
macg pts/0 5月15日15:55。2075 (192.168.1.100)
macghas记录
# shtest.sh
输入:ddd
DDD未记录
拿函数当条件(函数相当于命令,函数的好处是返回值可以自定义)
如果
以函数作为if条件,
格廷
那么撤退函数的值0为真,那就去。
附和“你的答案是肯定的”
else函数的返回值不为0时为false。去别的地方。
附和“你的回答是不”
船方不负担装货费用
ifcommand 等价于 command+if$?
$ vitestsh.sh
#!/bin/sh
如果
cat111-tmp.txt | grep ting1
然后
回声发现
其他
回显“未找到”
船方不负担装货费用
$vi testsh.sh
#!/bin/sh
cat111-tmp.txt | grep ting1
如果[$?-eq 0 ]
然后
echo$?
回声发现
其他
echo$?
回显“未找到”
船方不负担装货费用
$ shtestsh.sh
没有找到
$ shtestsh.sh
一个
没有找到
$ vi111-tmp.txt
那是222号文件
这是111文件
$ shtestsh.sh
这是111文件
找到
$ vi111-tmp.txt
那是222号文件
这是111文件
$ shtestsh.sh
这是111文件
0
找到
以条件表达式作为if条件
传统上,if采用条件表达式if条件来自句子——。
if[条件表达式]
然后
命令
命令
命令
其他
命令
命令
船方不负担装货费用
条件表达式
文件表达式
If [-f file]如果文件存在
如果[-d.]如果目录存在
If [-s file]如果文件存在并且不为空
如果文件存在并且可读
If [-w file]如果文件存在并且可写
If [-x file]如果文件存在并且可以执行
整数表达式
If [int1 -eq int2] If int1等于int2
如果[int1 -ne int2]不等于
If [int1 -ge int2] if=
如果[int1 -gt int2]
If [int1 -le int2] if=
If [int1 -lt int2] If
可变表达式
If [$a=$b]如果字符串1等于字符串2
字符串允许使用赋值符号作为等号。
if [$string1!=$string2]如果string1不等于string2
If [-n $string]如果字符串不为空(非0),则返回0(真)
If [-z $string]如果字符串为空
如果字符串不为空,则返回0(类似于-n)
条件表达式引用带有$的变量
if[a=b];然后
回声相等
其他
echono等于
船方不负担装货费用
[macg@machome~]$ sh test.sh
输入:
五
输入b:
五
Noequal(等于表达式,不是比较$a和$b,而是比较and a和b,自然是a!=b)
更正:
if[$ a=$ b];然后
回声相等
其他
echono等于
船方不负担装货费用
[macg@machome~]$ sh test.sh
输入:
五
输入b:
五
平等的
-eq -ne -lt -nt只能用于整数,不能用于字符串,字符串等于赋值号=
[macg@machome~]$ vi test.sh
echo-n 输入您的选择:
readvar
if [$var -eq yes ]
然后
echo$var
船方不负担装货费用
[macg@machome~]$ sh -x test.sh
输入您的选择:
y
test.sh:第3行:test: y:应为整数expression_r_r_r
应为整数形式,即-eq不支持字符串。
如果=放在别处,就是赋值;如果[],则表示字符串等于;外壳里没有==等于C语言。
不带空格的字符串,可以加“”也可以不加。
[macg@machome~]$ vi test.sh
回显“输入a:”
阅读a
echo“输入为$a”
if[$ a=123];然后
回声均衡123
船方不负担装货费用
[macg@machome~]$ sh test.sh
输入:
123
输入123
等于123
=作为等于时,其两边都必须加空格,否则失效
等号也是操作符,必须和其他变量,关键字,用空格格开(等号做赋值号时正好相反,两边不能有空格)
[macg@machome~]$ vi test.sh
回声输入您的选择:
readvar
if [$var=yes ]
然后
echo$var
回显"输入正确"
其他
echo$var
回显"输入错误"
船方不负担装货费用
[macg@machome~]$ vi test.sh
回声输入您的选择:
readvar
if [$var=yes ]在等号两边加空格
然后
echo$var
回显"输入正确"
其他
echo$var
回显"输入错误"
船方不负担装货费用
[macg@machome~]$ sh test.sh
输入您的选择:
y
y
输入正确
[macg@machome~]$ sh test.sh
输入您的选择:
n
n
输入正确
输错了也走然后,都走然后,为什么?
因为如果把$var=是连读成一个变量,而此变量为空,返回1,则走else [macg@machome ~]$ sh test.sh
输入您的选择:
y
y
输入恐怖
[macg@machome~]$ sh test.sh
输入您的选择:
不
不
输入恐怖
一切正常
如果[ $ANS ]等价于如果[ -n $ANS ]
如果字符串变量非空(然后),空(否则)
回声输入您的选择:
readANS
如果[$ANS ]
然后
埃科诺空
其他
回声报
船方不负担装货费用
[macg@machome~]$ sh test.sh
输入您的选择:回车
empth说明"回车"就是空串
[macg@machome~]$ sh test.sh
输入您的选择:
34
非空
整数条件表达式,大于,小于,外壳里没有和,会被当作尖括号,只有-ge,-gt,-le,lt
[macg@machome~]$ vi test.sh
回显"输入答:"
阅读a
if[$ a-ge 100];然后
echo3bit
其他
echo2bit
船方不负担装货费用
[macg@machome~]$ sh test.sh
输入:
123
3位
[macg@machome~]$ sh test.sh
输入:
20
2位
整数操作符号-ge,-gt,-le,-lt,别忘了加-
如果测试$阿格100;然后
[macg@machome~]$ sh test.sh
测试. sh:第四行:测试:ge:需要二元运算符
如果测试$ a-ge 100;然后
[macg@machome~]$ sh test.sh
输入:
123
3位
逻辑表达式
逻辑非!条件表达式的相反
如果[!表达式]
如果[!-d $num ]如果不存在目录$num
逻辑与答条件表达式的并列
如果[表达式1a表达式2]
逻辑或表示"具有…性质的"条件表达式的或
如果[表达式1o表达式2]
逻辑表达式
表达式与前面的=!=-dfx-ne-eq-lt等合用
逻辑符号就正常的接其他表达式,没有任何括号(),就是并列
if [-z $JHHOME -a -d $HOME/$num ]
注意逻辑与[构成动植物的古名或拉丁化的现代名]与逻辑或表示"具有…性质的"很容易和其他字符串或文件的运算符号搞混了
最常见的赋值形式,赋值前对=两边的变量都进行评测
左边测变量是否为空,右边测目录(值)是否存在(值是否有效)
[macg@mac-home~]$ vi test.sh
:
回显"输入号码:"
readnum
回声”输入为$num "
if [-z $JHHOME -a -d $HOME/$num ]如果变量$JHHOME为空,且$HOME/$num目录存在
然后
JHHOME=$HOME/$num则赋值
船方不负担装货费用
回声之家是$ JHHOME
-
[macg@mac-home~]$ sh test.sh
输入号码:
购买力平价
inputis ppp
杰霍梅斯
目录-d$HOME/$num不存在,所以$JHHOME没被然后赋值
[macg@mac-home~]$ mkdir ppp
[macg@mac-home~]$ sh test.sh
输入号码:
购买力平价
inputis ppp
jhomeis/home/macg/PPP
一个表示"具有…性质的"的例子,其中却揭示了"="必须两边留空格的问题
回声输入您的选择:
readANS
if[$ ANS= Yes -o $ ANS= Yes -o $ ANS= Y -o $ ANS= Y ]
然后
ANS=y
其他
ANS=n
船方不负担装货费用
回声$ANS
[macg@machome~]$ sh test.sh
输入您的选择:
n
y
[macg@machome~]$ sh test.sh
输入您的选择:
不
y
为什么输入不是是的,结果仍是y(走然后)
因为=被连读了,成了变量$ANS=是,而变量又为空,所以走其他了
[macg@machome~]$ vi test.sh
回声输入您的选择:
readANS回声”输入您的选择:"
readANS
if[$ ANS= Yes -o $ ANS= Yes -o $ ANS= Y -o $ ANS= Y ]
然后
ANS=y
其他
ANS=n
船方不负担装货费用
回声$ANS
[macg@machome~]$ sh test.sh
输入您的选择:
不
n
[macg@machome~]$ sh test.sh
输入您的选择:
是
y
[macg@machome~]$ sh test.sh
输入您的选择:
y
y
以 test条件表达式作为if条件
iftest $num -eq 0等价于if[$ numeq 0]
试验表达式,没有[ ]
iftest $num -eq 0
然后
回显"再试一次"
其他
回声"好"
船方不负担装货费用
曼特斯特
[macg@machome~]$ man测试
[(1)用户命令[(1)
摘要
测试表达式
[表情]
[名词]字符串
字符串的长度不为零同-EN和直接$str都是非0条件
-zSTRING
绳子的长度为零
STRING1=STRING2
字符串是相等的
STRING1!=STRING2
字符串不相等
整数1-情商整数2
整数一等于整数2
整数1-通用整数2
整数一大于或等于整数2
整数1-gt整数2
整数一大于整数2
整数1-整数2
整数一小于或等于整数2
整数1-lt整数2
整数一小于整数2
整数1-去甲肾上腺素整数2
整数一不等于整数2
文件1-核苷酸文件2
文件一比文件2新(修改日期)
文件1-ot文件2
文件一比文件2旧
-bFILE
文件存在,并且是特殊数据块
-cFILE
文件存在,并且是特殊字符
-d文件
文件存在并且是一个目录
-eFILE
文件存在文件存在
-菲勒
文件存在,并且是常规文件文件存在且是普通文件
-文件
文件存在,并且是符号链接(与-我相同)
LFILE
文件存在并且是一个符号链接(与-h相同)
-文件
文件存在,由有效的组身份证明拥有
-奥弗尔
文件存在,由有效用户身份证明拥有
-pFILE
文件存在,并且是一个命名管道
文件
文件存在,并且大小大于零
文件
文件存在,并且是套接字
-文件
文件存在且可写
-xFILE
文件存在并且可执行
if简化语句
最常用的简化如果语句
如果是"前面",则"后面"
[-f/var/run/dhcpd。PID]RM/var/run/dhcpd。PID检查文件是否存在,如果存在就删掉
|| 如果不是"前面",则后面
[ -f/usr/sbin/dhcpd ] ||出口0检验文件是否存在,如果存在就退出
用简化如果和$1,$2,$3来检测参数,不合理就调用帮助
[ -z$1 ]帮助如果第一个参数不存在(-z字符串长度为0 )
[ $1=-h ]帮助如果第一个参数是-h,就显示帮助
例子
#!/bin/sh
[-f /etc/sys config/network-scripts/if CFG-eth 0 ]RM-f/etc/sys config/network-scripts/if CFG-eth 0
CPI CFG-eth 0。bridge/etc/sys config/network-scripts/if CFG-eth 0
[-f /etc/sys config/network-scripts/ifcfg-et h1 ]RM-f/etc/sys config/network-scripts/ifcfg-et h1
CPI CFG-et h1。bridge/etc/sys config/network-scripts/if CFG-et h1
[-f /etc/sys config/network-scripts/if CFG-eth 0:1 ]RM-f/etc/sys config/network-scripts/if CFG-eth 0:1