Shell:操作符

在Shell脚本中,运算符用于执行数学计算、字符串操作、文件测试等任务。Shell脚本主要依赖于bash(Bourne Again SHell)或其他类似的shell环境,它们支持多种类型的运算符。下面我将详细介绍Shell中常见的一些运算符类型及其用法。

1. 算术运算符

算术运算符用于执行基本的数学运算,如加、减、乘、除等。在bash中,算术表达式可以通过几种方式执行,包括使用$((expression))扩展。

$((expression))$[expression] 都是用于执行算术扩展的语法。

  • 对于新的Shell脚本编写,推荐使用$((expression))语法进行算术扩展,因为它更符合POSIX标准,具有更广泛的兼容性和更强大的功能。
  • $[expression]虽然在一些情况下仍然可用,但由于其历史性和可能的兼容性问题,建议避免在新脚本中使用。

$((expression))里面是可以直接跟一个数学上的运行式的,如:>=符号,而$[expression]中需要使用-ge

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取模(余数)
  • **:幂运算(在某些shell版本中可能需要使用letexpr

示例

1
2
3
4
5
6
7
8
9
#!/bin/bash  
a=10  
b=20  
echo "a + b = $((a + b))"  
echo "a - b = $((a - b))"  
echo "a * b = $((a * b))"  
echo "a / b = $((a / b))"  
echo "a % b = $((a % b))"  
# 注意:幂运算可能需要使用其他方式,如使用let或expr

2. 赋值运算符

赋值运算符用于给变量赋值。

  • =:赋值

示例

1
2
3
#!/bin/bash  
a=10  
echo $a

3. 关系运算符

关系运算符用于测试两个值之间的关系(如等于、不等于、大于等)。在Shell中,这些运算符经常用在条件表达式中。

  • -eq:等于
  • -ne:不等于
  • -gt:大于
  • -ge:大于等于
  • -lt:小于
  • -le:小于等于

示例(使用if语句):

1
2
3
4
5
6
7
8
9
#!/bin/bash  
a=10  
b=20  
if [ $a -eq $b ]  
then  
   echo "$a -eq $b : a 等于 b"  
else  
   echo "$a -eq $b: a 不等于 b"  
fi

4. 字符串运算符

字符串运算符用于检查字符串是否相等、长度是否为零等。

  • =:等于
  • !=:不等于
  • -z:字符串长度为零
  • -n:字符串长度非零
  • str:字符串不为空

注意

  • [ 中,应该使用 = 来比较字符串是否相等,而不是 ==(尽管在一些 shell 实现中,== 可能也有效,但这不是 POSIX 标准的行为)。

  • [[ 中,=== 通常都可以用于字符串比较,但 = 是更符合 POSIX 标准的做法。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash  
a="abc"  
b="efg"  
if [ $a = $b ]; then  
   echo "$a = $b : a 等于 b"  
else  
   echo "$a = $b: a 不等于 b"  
fi  
  
if [ -z $a ]; then  
   echo "字符串a的长度为零"  
else  
   echo "字符串a的长度非零"  
fi

5. 文件测试运算符

文件测试运算符用于检查文件的各种属性,如文件是否存在、是否可读等。

  • -e:文件存在
  • -f:文件存在且是一个常规文件
  • -s:文件存在且不为空
  • -d:文件存在且是一个目录
  • -r:文件存在且可读
  • -w:文件存在且可写
  • -x:文件存在且可执行

示例

1
2
3
4
5
6
7
#!/bin/bash  
file="/path/to/your/file.txt"  
if [ -e "$file" ]; then  
   echo "文件存在"  
else  
   echo "文件不存在"  
fi

这些只是Shell中运算符的一个概览。根据你所使用的具体Shell(如bash、zsh等),可用的运算符和语法可能会有所不同。

6. let命令

在Shell脚本中,let命令主要用于执行算术运算。然而,需要注意的是,let命令并不是所有Shell环境(如bash、sh、zsh等)都原生支持的。特别是,在bash中,虽然let可以用于执行算术运算,但通常建议使用更现代的算术扩展方式,如$((expression))

let命令的基本语法

1
let expression

或者

1
let "expression"

其中,expression是一个或多个算术表达式,用空格分隔。算术表达式可以包括变量、数字以及算术运算符(如+-*/%(取模)等)。

示例

1.简单的算术运算

1
2
3
let a=5  
let b=a+10  
echo $b  # 输出 15

在这个例子中,我们首先给变量a赋值5,然后使用let命令将a与10相加的结果赋给变量b

2.使用双引号

虽然在这个简单的例子中双引号不是必需的,但在更复杂的表达式中,使用双引号可以避免解析错误。

1
2
3
let "a = 5"  
let "b = a + 10"  
echo $b  # 输出 15

然而,请注意,在bash中,通常不需要在let表达式周围使用双引号,除非表达式中包含空格或其他需要引起来的字符。

3.递增和递减

1
2
3
4
5
6
let a=5  
let a++  
echo $a  # 输出 6  
  
let a--  
echo $a  # 输出 5

4.更复杂的表达式

1
2
let "a = 5, b = 10, c = a * b"  
echo $c  # 输出 50

在这个例子中,我们同时计算了三个变量abc的值。

0%