设为首页 收藏本站
查看: 629|回复: 0

转:shell中的if语句

[复制链接]

尚未签到

发表于 2018-8-24 12:06:48 | 显示全部楼层 |阅读模式
  如果您曾用 C 编写过与文件相关的代码,则应该知道:要比较特定文件是否比另一个文件新需要大量工作。那是因为 C 没有任何内置语法来进行这种比较,必须使用两个 stat() 调用和两个 stat 结构来进行手工比较。相反,bash 内置了标准文件比较运算符,因此,确定“/tmp/myfile 是否可读”与查看“$myvar 是否大于 4”一样容易。
  下表列出最常用的 bash 比较运算符。同时还有如何正确使用每一选项的示例。示例要跟在 "if" 之后。例如:
  

  
if [ -z "$myvar" ]
  
then
  
echo "myvar is not defined"
  
fi
  

  

  

运算符
描述
示例
文件比较运算符            
-e             filename
如果             filename存在,则为真
[ -e /var/log/syslog ]
-d             filename
如果             filename为目录,则为真
[ -d /tmp/mydir ]
-f             filename
如果             filename为常规文件,则为真
[ -f /usr/bin/grep ]
-L             filename
如果             filename为符号链接,则为真
[ -L /usr/bin/grep ]
-r             filename
如果             filename可读,则为真
[ -r /var/log/syslog ]
-w             filename
如果             filename可写,则为真
[ -w /var/mytmp.txt ]
-x             filename
如果             filename可执行,则为真
[ -L /usr/bin/grep ]
filename1-nt             filename2
如果             filename1比             filename2新,则为真
[ /tmp/install/etc/services -nt /etc/services ]
filename1-ot             filename2
如果             filename1比             filename2旧,则为真
[ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符             (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z             string
如果             string长度为零,则为真
[ -z "$myvar" ]
-n             string
如果             string长度非零,则为真
[ -n "$myvar" ]
string1=             string2
如果             string1与             string2相同,则为真
[ "$myvar" = "one two three" ]
string1!=             string2
如果             string1与             string2不同,则为真
[ "$myvar" != "one two three" ]
算术比较运算符            
num1-eq             num2
等于
[ 3 -eq $mynum ]
num1-ne             num2
不等于
[ 3 -ne $mynum ]
num1-lt             num2
小于
[ 3 -lt $mynum ]
num1-le             num2
小于或等于
[ 3 -le $mynum ]
num1-gt             num2
大于
[ 3 -gt $mynum ]
num1-ge             num2
大于或等于
[ 3 -ge $mynum ]  有时,有几种不同方法来进行特定比较。例如,以下两个代码段的功能相同:
  

  
if [ "$myvar" -eq 3 ]
  
then
  
echo "myvar equals 3"
  
fi
  

  

  
if [ "$myvar" = "3" ]
  
then
  
echo "myvar equals 3"
  
fi
  

  

  

  上面两个比较执行相同的功能,但是第一个使用算术比较运算符,而第二个使用字符串比较运算符。
  回页首
  字符串比较说明
  大多数时候,虽然可以不使用括起字符串和字符串变量的双引号,但这并不是好主意。为什么呢?因为如果环境变量中恰巧有一个空格或制表键,bash 将无法分辨,从而无法正常工作。这里有一个错误的比较示例:
  

  
if [ $myvar = "foo bar oni" ]
  
then
  
echo "yes"
  
fi
  

  

  

  在上例中,如果 myvar 等于 "foo",则代码将按预想工作,不进行打印。但是,如果 myvar 等于 "foo bar oni",则代码将因以下错误失败:
  

  
[: too many arguments
  

  

  

  在这种情况下,"$myvar"(等于 "foo bar oni")中的空格迷惑了 bash。bash 扩展 "$myvar" 之后,代码如下:
  

  
[ foo bar oni = "foo bar oni" ]
  

  

  

  因为环境变量没放在双引号中,所以 bash 认为方括号中的自变量过多。可以用双引号将字符串自变量括起来消除该问题。请记住,如果养成将所有字符串自变量用双引号括起的习惯,将除去很多类似的编程错误。"foo bar oni" 比较          应该写成:
  

  
if [ "$myvar" = "foo bar oni" ]
  
then
  
echo "yes"
  
fi
  

  

  


更多引用细节
  如果要扩展环境变量,则必须将它们用            双引号、而不是单引号括起。单引号            禁用 变量(和历史)扩展。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-555955-1-1.html 上篇帖子: linux shell 高级(一) 下篇帖子: 细读shell-5
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表