【Shell】运算符

算术运算符

  • expr(求值表达式)命令

    expr 是 evaluate expressions 的缩写,译为“求值表达式”。

  • expr语法

    • 计算语法
      expr 算术运算符表达式
      
      注意:
          运算符表达式中每个数字与符号之间要有空格
          只能进行整数的运算,不能进行小数的运算
    • 获取计算结果赋值给新变量语法
      result=`expr 算术运算符表达式` #反引号 反引号可以执行里面的命令
      image
  • 算术运算符介绍

    下表列出了常用的算术运算符,假定变量 a 为 1,变量 b 为 2:

    运算符说明举例
    +加法expr $a + $b 结果为 3
    -减法expr $a - $b 结果为 -1
    *乘法expr $a \* $b 结果为 2
    /除法expr $b / $a 结果为 2
    %取余expr $b % $a 结果为 0
    =赋值a=$b 将把变量 b 的值赋给 a

    四则运算中如果使用了(), 也需要转义 \( 1 + 1 \),首个\(和数字之间需要有空格

    #!/bin/bash
    # 使用read命令读取输入两个数字
    read -p "请输入第一个数字:"
    read -p "请输入第二个数字:"
    
    # 对两个数字进行算数运算
    echo "a=${a} b=${b}"
    echo "a + b = `expr $a + $b`"
    echo "a * b = `expr $a \* $b`"
    echo "a - b = `expr $a - $b`"
    echo "a * b = `expr $a \* $b`"
    echo "b / a = `expr $b / $a`"
    echo "b % a = `expr $b % $a`"
    echo "b * (a + a) = `expr $b \* \( $a + $a \)`"

    image

比较运算符

  • 整数比较运算符[] 和 (())

    • 执行方式一:单词方式[ ],执行过成功中,字符与字符之间,符号与符号之间是有空格的
    • 执行方式二:符号(( )),不需要有空格

    下表列出了常用的比较运算符,假定变量 a 为 1,变量 b 为 2:

    运算符说明举例
    -eqequals 检测两个数是否相等,相等返回 0, 否则返回1。[ $a -eq $b ] 返回 1。
    -nenot equals检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 0。
    -gtgreater than检测左边的数是否大于右边的,
    是返回0, 否则1
    [ $a -gt $b ] 返回 1。
    -ltlower than检测左边的数是否小于右边的,
    是返回0, 否则1
    [ $a -lt $b ] 返回 0。
    -gegreater equals检测左边的数是否大于等于右边的,
    是返回0, 否则1
    [ $a -ge $b ] 返回 1。
    -lelower equals检测左边的数是否小于等于右边的,
    是返回0, 否则1
    [ $a -le $b ] 返回 0。
    <检测左边的数是否小于右边的,
    是返回0, 否则1
    (($a<$b)) 返回0
    <=检测左边的数是否小于等于右边的,
    是返回0, 否则1
    (($a<=$b)) 返回0
    >检测左边的数是否大于右边的,
    是返回0, 否则1
    (($a>$b)) 返回1
    >=检测左边的数是否大于等于右边的,
    是返回0, 否则1
    (($a>=$b)) 返回1
    ==检测左边的数是否等于右边的,
    是返回0, 否则1
    (($a==$b)) 返回1
    !=检测左边的数是否不等于右边的,
    是返回0, 否则1
    (($a!=$b)) 返回0

    注意:

    • 整数比较运算符只支持整数不支持小数与字符串(字符串比较后续讲解),除非字符串的值是整数数字。
    • 每个命令都有返回值, 这个后面我们会讲解退出状态再具体说明,返回0代表成功, 返回1代表失败
  • 演示

    #!/bin/bash
    a=1 b=2
    echo "a=${a} b=${b}"
    if [ $a -eq $b ]
    then
    echo "$a -eq $b : a 等于 b"
    else
    echo "$a -eq $b: a 不等于 b"  # 输出这个
    fi
    if [ $a -ne $b ]
    then
    echo "$a -ne $b: a 不等于 b"  # 输出这个
    else
    echo "$a -ne $b : a 等于 b"
    fi
    if [ $a -gt $b ]
    then
    echo "$a -gt $b: a 大于 b"
    else
    echo "$a -gt $b: a 不大于 b"  # 输出这个
    fi
    if [ $a -lt $b ]
    then
    echo "$a -lt $b: a 小于 b"   # 输出这个
    else
    echo "$a -lt $b: a 不小于 b"
    fi
    if [ $a -ge $b ]
    then
    echo "$a -ge $b: a 大于或等于 b"
    else
    echo "$a -ge $b: a 小于 b"  # 输出这个
    fi
    if [ $a -le $b ]
    then
    echo "$a -le $b: a 小于或等于 b"  # 输出这个
    else
    echo "$a -le $b: a 大于 b"
    fi
    
    if (($a > $b))
    then
    echo "$a > $b: a 大于 b"
    else
    echo "$a > $b: a 不大于 b"
    fi
    if (($a < $b))
    then
    echo "$a < $b: a 小于 b"
    else
    echo "$a < $b: a 不小于 b"
    fi
    if (($a >= $b))
    then
    echo "$a >= $b: a 大于或等于 b"
    else
    echo "$a >= $b: a 小于 b"
    fi
    if (($a <= $b))
    then
    echo "$a <= $b: a 小于或等于 b"
    else
    echo "$a <= $b: a 大于 b"
    fi

    image

  • 字符串比较运算符[] 和 [[]]

    可以比较2个变量, 变量的类型可以为数字(整数,小数)与字符串

    • 语法:

      假定变量 a 为 “abc”,变量 b 为 “efg”:

      运算符说明举例
      == 或 =相等。用于比较两个字符串或数字,相同则返回 0。可以使用=[ $a == $b ] 返回1 [ $a = $b ] 返回 1[[ $a == $b ]] 返回1[[ $a = $b ]] 返回1
      !=不相等。用于比较两个字符串或数字,不相同则返回 0。[ $a != $b ] 返回 0[[ $a != $b ]] 返回 0
      <小于, 用于比较两个字符串或数字, 小于返回0, 否则返回1[ $a \< $b ] 返回 0[[ $a < $b ]] 返回 0
      >大于, 用于比较两个字符串或数字, 大于返回0, 否则返回1[ $a \> $b ] 返回 1[[ $a > $b ]] 返回 1
      -z检测字符串长度是否为0,如果长度为0返回则返回0, 否则返回1。[ -z $a ] 返回 false。
      -n检测字符串长度是否不为 0,如果长度不为 0 则返回0, 否则返回1。[ -n “$a” ] 返回 true。
      $检测字符串是否为空,为空返回0,不为空返回1[ $a ] 返回 true。
      • 字符串比较可以使用[[ ]]和[ ] 2种方式
        • [] 大于号、小于号需要使用\转义,[[]]不需要转义
      • 字符串比较没有 <= 可以通过 [[ "a" < "b" && "a" == "b" ]]
  • 演示:

    #!/bin/bash
    
    a="itheima" b="itcast" c=1 d=2
    echo "a=${a},b=${b},c=${c},d=${d}"
    
    if [ $a = $b ]
    then
    echo "$a = $b : a 等于 b"
    else
    echo "$a = $b: a 不等于 b"
    fi
    
    if [ $a != $b ]
    then
    echo "$a != $b : a 不等于 b"
    else
    echo "$a != $b: a 等于 b"
    fi
    
    if [[ $a > $b ]]
    then
    echo "$a > $b : a 大于 b"
    else
    echo "$a > $b: a 不大于 b"
    fi
    
    if [ $a \> $b ]
    then
    echo "$a > $b : a 大于 b"
    else
    echo "$a > $b: a 不大于 b"
    fi
    
    if [[ $c > $d ]]
    then
    echo "$c > $d : c 大于 d"
    else
    echo "$c > $d: c 不大于 d"
    fi
    
    if [ -z $a ]
    then
    echo "-z $a : 字符串长度为 0"
    else
    echo "-z $a : 字符串长度不为 0"
    fi
    
    if [ -n "$a" ]
    then
    echo "-n $a : 字符串长度不为 0"
    else
    echo "-n $a : 字符串长度为 0"
    fi
    
    if [ $a ]
    then
    echo "$a : 字符串不为空"
    else
    echo "$a : 字符串为空"
    fi

    image

    • [[]] (推荐) 和 [] 的区别

      比较运算符有个三个:[[]]、[]、(())

      • 不推荐使用(()) 原因:只能比较整数、字符串比较不了、小数也比较不了(不推荐)
      • 区别2:word splitting(单词分割)的发生
        • word splitting介绍:

          • 会将含有空格字符串进行分拆分割后比较
        • 区别说明:

          • [[]] 不会有word splitting发生
          • [] 会有word splitting发生

          image

      • 区别2: 转义字符
        • 区别说明:
          • [[]] 对 < 不需要转义, 格式为 [[ 字符串1 < 字符串2 ]]image

          • [] 需要对 <,> 转义 , 格式为 [ 字符串1 \< 字符串2 ]image

布尔运算符[-a、-o、!]

布尔运算符放在[ ]或 与test 命令配合使用才有效

运算符说明举例
!非运算,取反, 表达式为 true 则返回 false,
否则返回 true。
[ ! 表达式 ] 取反。
-oor 或运算,有一个表达式为 true 则返回 true。[ 表达式1 -o 表达式2 ]
-aand 与运算,两个表达式都为 true 才返回 true。[ 表达式1 -a 表达式2 ]
#!/bin/bash
a=1 b=2

if [ $a -lt 2 -a $b -gt 10 ]
then
echo "$a 小于 2 且 $b 大于 10 : 返回 true"   
else
echo "$a 小于 2 且 $b 大于 10 : 返回 false"  # $b -gt 10不成立, 输出这个表达式
fi

if [ $a -lt 10 -o $b -gt 10 ]
then
echo "$a 小于 10 或 $b 大于 10 : 返回 true"  # $a -lt 10 成立, 输出这个表达式
else
echo "$a 小于 10 或 $b 大于 10 : 返回 false"
fi

if [ ! $a -gt $b ]
then
echo "$a 大于 $b 取反 : 返回 true"
else
echo "$a 大于 $b 取反 : 返回 false"   # $a -gt $b 为true , 取反为false, 输出这个表达式
fi

image

逻辑运算符[[&&、||、!]] ((&&、||)) [!]

运算符说明举例
&&逻辑的 AND[[ 表达式1 && 表达式2 ]]
||||
!逻辑非[[ ! 表达式 ]]

注意:

  1. 使用&& 和 || 的运算符必须放在 [[]] 或 (())中才有效, 否则报错
  2. ! 可以用在[],[[]]中, 不可以在(())
#!/bin/bash

a=1 b=2

if [[ $a -lt 10 && $b -gt 10 ]]
then
echo "返回 true" 
else
echo "返回 false"  # $b -gt 10 不成立, 输出false
fi

if [[ $a -lt 10 || $b -gt 10 ]]
then
echo "返回 true"   # $a -lt 10 成立,  输出true
else
echo "返回 false"  
fi

image

文件测试运算符

  • linux系统文件类型介绍

    • -:普通文件
    • d:目录文件
    • l:链接文件
    • b:块设备文件,比如计算机硬盘/dev/sda
    • c:字符设备文件,比如计算机的USB文件/dev/usb
    • p:管道文件
  • 属性检测

    操作符说明举例
    -b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
    -c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
    -d filedirectory, 检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
    -f filefile, 检测文件是否是普通文件(既不是目录,也不是设备文件)
    ,如果是,则返回 true。
    [ -f $file ] 返回 true。
    -g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
    -k file检测文件是否设置了粘着位(Sticky Bit),如果是,
    则返回 true。
    [ -k $file ] 返回 false。
    -p file检测文件是否是有名管道文件,如果是,则返回 true。[ -p $file ] 返回 false。
    -u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
    -r fileread,检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
    -w filewrite,检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
    -x fileexecute, 检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
    -s filesize, 检测文件是否为空(文件大小是否大于0)
    ,不为空返回 true。
    [ -s $file ] 返回 true。
    -e fileexists, 检测文件(包括目录)是否存在,如果是,
    则返回 true。
    [ -e $file ] 返回 true。
    file1 -nt file2new than(nt), file1是否比file2新[ file1 -nt file2 ]
    file1 -ot file2old than(ot), file1是否比file2旧[ file1 -ot file2 ]
  • 其他检查符:

    • -S: 判断某文件是否 socket。
    • -L: link, 检测文件是否存在并且是一个符号链接。
  • 语法:

    [ options 文件路径字符串]
    或
    [[ options 文件路径字符串 ]]
  • 演示:

    #!/bin/bash
    
    file="/root/operation1.sh"
    # 测试文件是否可写
    if [ -w $file ]
    then
    echo "文件可写"
    else
    echo "文件不可写"
    fi
    # 测试是否可读
    if [ -r $file ]
    then
    echo "文件可读"
    else
    echo "文件不可读"
    fi
    # 测试是否执行
    if [ -x $file ]
    then
    echo "文件可执行"
    else
    echo "文件不可执行"
    fi
    # 测试文件是什么类型的文件
    if [ -f $file ]
    then
    echo "文件是普通文件"
    else
    echo "文件是特殊文件"
    fi
    # 测试文件是否为空
    if [ -s $file ]
    then
    echo "文件不是空"
    else
    echo "文件是空"
    fi
    # 测试文件是否存在
    if [ -e $file ]
    then
    echo "文件存在"
    else
    echo "文件不存在"
    fi
    # 测试文件是否是目录
    if [ -d $file ]
    then
    echo "文件是目录"
    else
    echo "文件不是目录"
    fi
    
    # 判断文件的新旧
    file2="/root/operation2.sh"
    if [ file -nt file2 ]
    then
    echo "operation1.sh文件比operation2.sh文件新"
    else
    echo "operation1.sh文件不比operation2.sh文件新"
    fi

    image

    image

使用优化算法,以优化VMD算法的惩罚因子惩罚因子 (α) 和分解层数 (K)。 1、将量子粒子群优化(QPSO)算法与变分模态分解(VMD)算法结合 VMD算法背景: VMD算法是一种自适应信号分解算法,主要用于分解信号为不同频率带宽的模态。 VMD的关键参数包括: 惩罚因子 α:控制带宽的限制。 分解层数 K:决定分解出的模态数。 QPSO算法背景: 量子粒子群优化(QPSO)是一种基于粒子群优化(PSO)的一种改进算法,通过量子行为模型增强全局搜索能力。 QPSO通过粒子的量子行为使其在搜索空间中不受位置限制,从而提高算法的收敛速度与全局优化能力。 任务: 使用QPSO优化VMD中的惩罚因子 α 和分解层数 K,以获得信号分解的最佳效果。 计划: 定义适应度函数:适应度函数根据VMD分解的效果来定义,通常使用重构信号的误差(例如均方误差、交叉熵等)来衡量分解的质量。 初始化QPSO粒子:定义粒子的位置和速度,表示 α 和 K 两个参数。初始化时需要在一个合理的范围内为每个粒子分配初始位置。 执行VMD分解:对每一组 α 和 K 参数,运行VMD算法分解信号。 更新QPSO粒子:使用QPSO算法更新粒子的状态,根据适应度函数调整粒子的搜索方向和位置。 迭代求解:重复QPSO的粒子更新步骤,直到满足终止条件(如适应度函数达到设定阈值,或最大迭代次数)。 输出优化结果:最终,QPSO算法会返回一个优化的 α 和 K,从而使VMD分解效果最佳。 2、将极光粒子(PLO)算法与变分模态分解(VMD)算法结合 PLO的优点与适用性 强大的全局搜索能力:PLO通过模拟极光粒子的运动,能够更高效地探索复杂的多峰优化问题,避免陷入局部最优。 鲁棒性强:PLO在面对高维、多模态问题时有较好的适应性,因此适合海上风电时间序列这种非线性、多噪声的数据。 应用场景:PLO适合用于优化VMD参数(α 和 K),并将其用于风电时间序列的预测任务。 进一步优化的建议 a. 实现更细致的PLO更新策略,优化极光粒子的运动模型。 b. 将PLO优化后的VMD应用于真实的海上风电数据,结合LSTM或XGBoost等模型进行风电功率预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al6n Lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值