【shell 中 if 和 else 用法详解】

原文链接:https://www.cnblogs.com/matthewma/p/6995479.html

shell的if语法和C语言等高级语言非常相似,
注意:shell的if语句对空格方面的要求比较严格(其实shell对所有语法的空格使用都比较严格),
如果在需要空格的地方没有打上空格,都会报错。
如if [ $1x == "ip"x ];then echo “abc”;fi中少一个空格都会报错。
shell的if语句必须以fi作为结尾,不然同样会报错。

有else和elif时也一样,注意空格问题

例子:
if [ $1x == "ab"x ]; then
echo “you had enter ab”
elif [ $1x == "cd"x ]; then
echo “you had enter cd”
else
echo “you had enter unexpected word”
fi

【if功能:“对比”】
在C语言等高级语言中,不管是对比字符串、还是对比整型、浮点数等等数据类型,都是使用==、<=等等对比运算符就可以完成。
但是在shell中对比字符串和对比数字,却是要分开两种方式。

对比字符串只能使用==、<、>、!=、-z、-n。
对比字符串时,末尾一定要加上x(或者a、b等)一个字符,因为if [ $1x == “ab"x ]时如果没有了x ,并且$1是”",
这个语句会翻译成if [ == “ab” ],左边相当于没有东西,会报语法错误。
或者使用[[ ]],就不需要x。
使用左尖号<或者右尖号>时,如果是用[ ],需要用转义符"",如>。

对比数字既能使用-eq、-ne、-gt、-ge、-lt、-le,也能使用==、<、>、!=:
-eq是equal
-ne是unequal
-gt是greater than
-ge是greater than or equal to
-lt是less than
-le是less than or equal to

【使用正则表达式】
if在对比时可以使用正则表达式,如if [[ $1 == aa ]](或if [ $1x == aax ])。
如果使用""把aa包起来,就会变成字符,而不是正则表达式中的。

【[和[[的区别】
区别一
在[中使用逻辑运算符,需要使用-a(and)或者-o(or)。在[[中使用逻辑运算符,需要使用&&或者||。

区别二
[是shell命令,在它包围的表达式是它的命令行参数,所以串比较符>和<需要转义,否则就变成io重定向了。
[[是shell关键字,不会做命令行扩展,所以<和>不需要进行转义。
但是语法相对严格,如在[中可以用引号括起操作付,[[则不行。如if [ “-z” “ab” ]。

区别三
[[可以做算术扩展,[则不行。如if [[ 11+1 -eq 100 ]],而if [ 11+1 -eq 100 ]则会报错。

【文件判断】
在高级语言中,判断文件是否存在等各种状态都是需要调用特定的函数进行判断。
而在shell中,这方面就比较方便些,只需要运算符即可。

常用的文件判断运算符如下:
-e 文件是否存在
-f 文件是否是普通文件(不是目录、设备文件、链接文件)
-s 表示文件大小不为0
-d 表示文件是否是目录
-b 表示是块设备(光驱、软盘等)
-c 表示是字符设备(键盘、声卡等)
-p 表示是管道
-h 表示是符号链接
-S 表示是否是socket
-r、-w、-x表示文件是否有可读、可写、可执行权限(指运行这个测试命令的用户)

f1 -nt f2 f1是否比f2新(new than)
f1 -ot f2 f1是否比f2旧(old than)
f1 -ef f2 f1和f2是否是相同文件的硬链接

使用!时表示上述结果取反。

例子:
myfile=“aa.txt”
if [ ! -f $myfile ]; then
echo $myfile" is not exist"
touch $myfile
else
echo $myfile" is exist"
fi

if [ ! -s $myfile ]; then
echo “hello, my master” > $myfile
else
echo $myfile" is not null"
fi

shell之if和else相关推荐

  1. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理

    准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...

  2. Linux shell 学习笔记(16)— shell 入门总结

    1. Shell 变量 Shell 变量包括自定义变量和环境变量: 自定义变量:脚本中自己命名定义的变量,通常为局部变量,其他 Shell 程序不能访问到: 环境变量,操作系统已定义的变量,如 PAT ...

  3. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  4. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务

    1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...

  5. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  6. Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)

    1. 命令行参数 向 shell 脚本传递数据的最基本方法是使用命令行参数.命令行参数允许在运行脚本时向命令行添加数据. $ ./addem 10 30 本例向脚本 addem 传递了两个命令行参数( ...

  7. Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符

    1. for 语句 bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值. for var in list docommands done 也可以 ...

  8. Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)

    1. 使用 if-then 语句 最基本的结构化命令就是if-then语句.if-then语句有如下格式. if command then ​ commands fi 或者 if command; t ...

  9. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)

    1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...

  10. Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)

    1. Linux的安全性 Linux 安全系统的核心是用户账户.每个能进入 Linux 系统的用户都会被分配唯一的用户账户.用户对系统中各种对象的访问权限取决于他们登录系统时用的账户. 用户权限是通过 ...

最新文章

  1. Html 教程(2)语法和属性
  2. SaltStack WEB UI Halite初体验
  3. oracle cloud认证费用,ORACLE Cloud 创建实例费用提问
  4. 计算机网络及标准化组织
  5. ArcEngine中拓扑的使用
  6. SQL Serve——版本
  7. Atitit.jsou html转换纯文本 java c# php
  8. android向DDR读写数据,解决刷机回安卓时提示:Romcode/初始化DDR/读取初始化结果/USB...的问题...
  9. 小米随身wifi没有网络显示无服务器,小米wifi怎么用 小米随身wifi无法上网怎么办...
  10. 求助:CISCO2811DHCP中继配置
  11. MAC下微软Word修改样式为宋体却显示SimSun-Extb的解决办法
  12. 【美港探案】万物云港股IPO:背靠万科,物业也要搞云?
  13. OSS对象存储是什么?
  14. xman_2019_format(非栈上格式化字符串仅一次利用的爆破)
  15. BZOJ4049 [Cerc2014] Mountainous landscape
  16. 为什么从移动携号转网到了联通,来电显示是中国移动?
  17. Generator cannot target libraries that have not been migrated to null-safety.
  18. 王者荣耀头像大小怎么调?调整图片尺寸大小工具分享
  19. 步进电机原理及其使用说明
  20. ironpython 使用-IronPython

热门文章

  1. python朝圣之路-模块篇
  2. 分布式事务之Seata个人吐血整理
  3. raid管理软件MegaRAID Storage Manager(MSM)的安装和使用
  4. magnifierrentgen(放大镜)插件的使用
  5. Linux中vi上下键变成ABCD
  6. 有道 - 词典在线发音API链接(日语)
  7. 车企如何趟过「软件的坑」,大众集团或将在中国寻求收购
  8. warning: waiting for transaction lock on /var/lib/rpm/.rpm.lock
  9. 如何看待Facebook 中国程序员之死:年仅 38 岁跳楼轻生,浙大 EE 毕业生,去年刚入职...
  10. 火山引擎 RTC 自研音频编码器 NICO 实践之路