linux条件测试,if语句,case语句

一、条件测试

1.1 测试命令

格式1:test 条件表达式 格式2:[ 条件表达式 ]

test命令和 [ ] 相同,建议使用[ ] #方框中要空格 #用test可能会不小心定义变量

1.2 文件测试

常见的测试操作符含义
-d测试是否为目录
-f测试是否为文件
-L测试是否为软连接文件
-r测试当前用户是否有权限读取
-w测试当前用户是否有权限写入
-x测试当前用户是否有权限执行
-e测试目录或文件是否存在
属性测试
-s FILE是否存在且非空
-t fd文件描述符是否在某终端已经打开
-N FILE文件自从上一次被读取之后是否被修改过
-O FILE当前有效用户是否为文件属主
-G FILE当前有效用户是否为文件属组

示例一:测试文件类型

1.目录文件 -d

[root@localhost ~]# [ -d /etc ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -d /etc/passwd ]
[root@localhost ~]# echo $?
1
​
​

2.普通文件 -f

[root@localhost ~]# [ -f /etc/passwd ]
[root@localhost ~]# echo $?
0
​

3.软连接文件 -L

[root@localhost ~]# [ -L /etc/passwd ]
[root@localhost ~]# echo $?
1
​

示例二:权限测试

1.读权限 -r

[root@localhost ~]# [ -r /etc/passwd ]
[root@localhost ~]# echo $?
0
​

2.写权限 -w

[root@localhost ~]# [ -w /etc/passwd ]
[root@localhost ~]# echo $?
0
​

3.执行权限 -x

[root@localhost ~]# [ -x /etc/passwd ]
[root@localhost ~]# echo $?
1
​

1.2 整数比较

只能用于整数

格式 [ 整数1 操作符 整数2 ]

  • -eq:第一个数等于(Equal)第二个数

  • -ne:第一个数不等于(Not Equal)第二个数

  • -gt:第一个数大于(Greater Than)第二个数

  • -lt:第一个数小于(Lesser Than)第二个数

  • -le:第一个数小于或等于(Lesser or Equal)第二个数

  • -ge:第一个数大于或等于(Greater or Equal)第二个数

[root@test1 ~]# a=2        实例
[root@test1 ~]# b=3
[root@test1 ~] [ $a -eq $b ]
[root@test1 ~]# echo $?
1
[root@test1 ~]# [ 2 -le 3 ]
[root@test1 ~]# echo $?
0

1.3 字符串比较

记得加空格

常用的测试操作符**

  • =:字符串内容相同

  • !=:字符串内容不同,! 号表示相反的意思

  • -z:字符串内容为空

  • -n: 字符是否存在

格式

[ 字符串1 = 字符串2 ] 是否相同

[ 字符串1 != 字符串2 ] 是否不相同

[ -z 字符串 ] 是否为空

[ -n 字符串 ] 字符是否存在

[root@xkj ~]# str1=xia
[root@xkj ~]# str2=li
[root@xkj ~]# [ $str1 =$str2 ]
[root@xkj ~]# [ $str1 = $str2 ]
[root@xkj ~]# echo $?
1
[root@xkj ~]# str3=xia
[root@xkj ~]# [ $str1 = $str3 ]
[root@xkj ~]# echo $?
0
​
​

1.4 逻辑测试

格式 [ 表达式1 ] 操作符 [ 表达式2 ] 命令1 操作符 命令2

操作符含义
-a或&&逻辑与,全真才为真
-o逻辑或,一真即为真
逻辑否
1.4.1 逻辑与 &&

CMD1 && CMD2 #同时满足命令1 和命令2 的要求 才会返回正确 ,输出命令2的结果

全真才为真 一假即为假 第一个CMD1结果为真 ,第二个CMD2必须要参与运算,才能得到最终的结果

第一个CMD1结果为假 ,总的结果必定为假,因此不需要执行CMD2

[root@xkj ~]# mkdir /test/{aa,bb} && ls
mkdir: 无法创建目录"/test/aa": 没有那个文件或目录
mkdir: 无法创建目录"/test/bb": 没有那个文件或目录
#前一个命令无法执行,无结果
[root@xkj ~]# mkdir /etc/{aa,bb} && ls
anaconda-ks.cfg  initial-setup-ks.cfg  nginx-1.18.0.tar.gz.1  公共  图片  音乐
bjc.sh           install_nginx.sh      xkj.sh                 模板  文档  桌面
cai.sh           nginx-1.18.0.tar.gz   yes.sh                 视频  下载
[root@xkj ~]# 
#前一个命令执行即两个命令都能执行
1.4.2 逻辑或 ||

CMD1 || CMD2 #命令1满足要求,直接输出命令1的结果,不需要命令2参与 #如果命令1不满足要求,命令2满足,会输出命令2的结果

一真即为真 第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2 第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,才能得到最终的结果

[root@xkj ~]# mkdir /test/{aa,bb} || ls
mkdir: 无法创建目录"/test/aa": 没有那个文件或目录
mkdir: 无法创建目录"/test/bb": 没有那个文件或目录
anaconda-ks.cfg  initial-setup-ks.cfg  nginx-1.18.0.tar.gz.1  公共  图片  音乐
bjc.sh           install_nginx.sh      xkj.sh                 模板  文档  桌面
cai.sh           nginx-1.18.0.tar.gz   yes.sh                 视频  下载
#有一个能执行就有结果

1.4.3 组合应用

用法只有一种

cmd1 && cmd2 || cmd3

#短路与必须在短路或前

[root@xkj ~]# mkdir -p 11/22 && pwd || ls
/root
#前面的命令正确因此不会执行ls
[root@xkj ~]# mkdir -p 11/22 && xx || ls
bash: xx: 未找到命令...
11               initial-setup-ks.cfg   xkj.sh  视频  音乐
anaconda-ks.cfg  install_nginx.sh       yes.sh  图片  桌面
bjc.sh           nginx-1.18.0.tar.gz    公共    文档
cai.sh           nginx-1.18.0.tar.gz.1  模板    下载
#前面的命令有误,直接执行ls

1.5 多个命令组合执行 ( ) { }

()会开启子shell

{ } 不会开启子shell

( cmd1; cmd2; ... )

{ cmd1; cmd2 ; cmd3 }

#{}和 () 中要加空格 #多条命令要用; 隔开

[root@xkj mnt]# { cd /opt ; ls ; }
rh
​

二、if语句

2.1单分支结构

#单分支格式#

if [  判断条件  ]
then ; echo "  "
else
echo "   "
fi

2.2 多分支结构

#多分支#
​
if [ 判断   ]
then 
echo "  "
elif[   ] #可以无限elif 
if
...
​
fi
​
else #以上条件都为假
echo "   "
​
fi
# if 和 fi要对应
​

三、case语句

3.1 case语句结构

#基本结构#
case 变量名 in
    值1)
        # 匹配值1时执行的代码块
        ;;
    值2)
        # 匹配值2时执行的代码块
        ;;
    值3)
        # 匹配值3时执行的代码块
        ;;
    *)
        # 不匹配任何值时执行的代码块,类似于default语句
        ;;
esac

case支持glob风格的通配符:

*任意长度任意字符 ? 任意单个字符 [0-9] 指定范围内的任意单个字符 | 或者,如: a|b

#可以用嵌套结构#
case 变量名 in
    值1)
    case 变量名 in
      值a)
      ....
      ;;
      值b)
      ....
      ;;
      *)
      ....
      ;;
      esac
      ;;
    值2)
    ....
        ;;
    *)
       ....
        ;;
esac
​
#一个case就要有一个esac对应
​

四、echo命令详解

echo -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符

选项作用
\r光标移至行首,并且不换行
\s当前shell的名称,如bash
\t插入Tab键,制表符
\n输出换行
\f换行,但光标仍停留在原处
\表示插入“\”本身转义
\b表示退格 不显示前一个字符
\c抑制更多的输出或不换行
#自动磁盘分区#
#以/dev/sdb 为例
echo -e "n\n\n\n\n\nw" | fdisk /dev/sdb
​
[root@xkj ~]# echo -e "n\n\n\n\n\nw" | fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
​
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
​
Device does not contain a recognized partition table
使用磁盘标识符 0x50934b96 创建新的 DOS 磁盘标签。
​
命令(输入 m 获取帮助):Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): Using default response p
分区号 (1-4,默认 1):起始 扇区 (2048-41943039,默认为 2048):将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB
​
命令(输入 m 获取帮助):The partition table has been altered!
​
Calling ioctl() to re-read partition table.
正在同步磁盘。
  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值