shell脚本中变量判断

# 前言

在linux中,通常我们所指的脚本编程,指的是bash的脚本编程。

bash作为一种过程式的编程语言来说,它应该具备编程语言所应该具备的基本元素,即:变量,流程,函数,数组。今天我们介绍变量以及流程之一的条件判断。

# 变量

# 初识变量

在编程语言中,编程语言有两大种,强类型语言和弱类型语言

  • 强类型语言中,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。java、.NET、C++等都是强制类型定义的。
  • 与其相对应的是弱类型语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

常见的数据类型有:

  • 数值型:×××,浮点型,布尔型
  • 字符型:单字符,字符串

bash属于弱类型语言,其默认的变量类型为字符型。

# bash中的变量

我们知道,变量可以按其数据的类型进行划分,在bash中变量按其作用域的不同,也可以进行不同的划分。

  • a) 局部变量:在bash脚本中,其作用域范围为局部性,比如想限制变量只在某函数中起作用
  • b) 本地变量:在bash脚本中,其作用域范围为整个脚本,即脚本开始到结束
  • c) 环境变量:系统工作使用的变量,常见的环境变量有,$PATH, $HOME, $PWD, 等等
  • d) 位置参数变量:用于向脚本中传递参数
  • e) 特殊变量:bash中预先定义好的具有特殊意义的比变量,如:$0, $1, $#, $@,….

# 变量的定义和使用

  • a) 声明某变量为局部变量:local VAR_NAME=VALUE
  • b) 声明某变量为本地变量:
  • I) 不指定类型,默认类型为字符型 : VAR_NAEM=VALUE
  • II) 定义数据类型为整数型:let VAR_NAME=VALUE 或 declare -i VAR_NAME=VALUE
  • III) 声明某变量为环境变量:export VAR_NAME=VALUE 或 declare -x VAR_NAME=VALUE

# 语法部分

# 字符串判断【常用】

  • str1 == str2 或者 str1 = str2 当两个串有相同内容、长度时为真;【两边要有空格】
  • str1 != str2      当串str1和str2不等时为真
  • -n str1        当串的长度大于0时为真(串非空)
  • -z str1        当串的长度为0时为真(空串)
  • str1         当串str1为非空时为真

# 数字的判断

  • int1 -eq int2    两数相等为真
  • int1 -ne int2    两数不等为真
  • int1 -gt int2    int1大于int2为真
  • int1 -ge int2    int1大于等于int2为真
  • int1 -lt int2    int1小于int2为真
  • int1 -le int2    int1小于等于int2为真

# 文件的判断

  • -r file     用户可读为真
  • -w file     用户可写为真
  • -x file     判断文件是否具有执行权限
  • -f file     判断所接的file是否为文件,是为真,否为假
  • -d file     判断file是否为目录,是目录为真,否为假
  • -c file     文件为字符特殊文件为真
  • -b file     文件为块特殊文件为真
  • -s file     文件大小非0时为真
  • -t file     当文件描述符(默认为1)指定的设备为终端时为真

其他参数

  • -e $file : 判断文件是否存在,存在为真
  • -f $file: 判断文件是否存在,且为普通文件,满足条件为真
  • -d $file: 判断是否存在且为为目录
  • -b $file: 判断是否存在且为块设备
  • -c $file: 判断是否存在且为字符设备
  • -S $file: 判断是否存在且为套接字设备
  • -p $file: 判断是否存在且为管道设备
  • -L $file: 判断是否存在且为符号链接文件
  • -r,w,x $file: 判断用户是否对此文件有读,写,执行权限
  • -u,g,k $file: 判断文件是否拥有suid,sgid, sticky的权限
  • -O,-G $file:判断当前用户是否为此文件的属主,属组
  • -z 是否为空 为空则为真;
  • -a 是否不空;
#if语句进行判断是否为空
[ "$name” = "" ]
#等同于
[ ! "$name" ]
[ -z "$name" ]    
1
2
3
4
5

文件比较

  • $file1 -nt $file2: (new than)判断文件1是否比文件2新
  • $file1 -ot $file2: (old than)判断文件1是否比文件2新
  • $file1 -et $file2: 判断文件1是和文件是否为同一个文件的硬链接

# 复杂逻辑判断/多条件表示

  • -a 逻辑与:if [ condition1 -a condition2 ] 或者 if [ condition1 ] && [ condition2 ];
  • -o 逻辑或:if [ condition1 -o condition2 ] 或者 if [ condition1 ] || [ condition2 ];
  • ! 逻辑非(取反):!;

命令间的逻辑关系

  • 逻辑与:&&

    第一个条件为假 第二个条件不用在判断,最总结果已经有; 第一个条件为真,第二个条件必须得判断;

  • 逻辑或:||

# Case when

linux中有和java中类似的case when条件;

1.条件xx)注意单括号

2.一个条件结束了用双的分号

#!/bin/bash
echo 'Input a number:'
read Num
case $Num in
1) 
    echo "You select 1"
;;
2)
    echo "You select 2"
;;
3)
    echo "You select 3"
;;
4|5)
    echo "You select 4or5"
;;
*)
    echo "default"
;;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 实践使用

# 字符串实践

# 数字实践

# 多条件

a=5
if [ $a -lt 1 ]; then
  echo "<1"
elif [ $a -gt 100 ]; then
  echo ">1"
elif [ $a -gt 1 ] && [ $a -lt 10 ]; then #注意 && 还是 || 必须[]分割开;
  echo "ok"
else
  echo "on ok"
fi
1
2
3
4
5
6
7
8
9
10

# Case

    for i in "$@"; do
        case $i in
        a | admin )
            buildAdmin
            ;;
        w | web)
            buildWeb
            ;;
        c | capacity)
            buildCapacity
            ;;
        f | files)
            buildFiles
            ;;
        *)
            echo "项目命令不存在"
            ;;
        esac
    done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 文件实践

image-20211228194929159

上次更新: 2022/04/15, 05:41:30
×