linux shell中if的各种判断

linux shell中if的各种判断

本文主要介绍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

linux shell中if的各种判断