期目录:
上期教程我们了解了Shell编程的概念以及变量,这节教程我们继续学习Shell编程。
一、数据类型
与传统的编程语言不同,Shell 编程是基于命令行解释器的,并且它不像 C 或 Java 语言那样有严格的静态数据类型。Shell 中的“数据类型”相对松散,主要依赖于变量的上下文来确定其行为。
注意:这里我们的所有内容但是基于Centos7的Bash Shell进行讲解的。
在Shell 中,变量并不需要声明类型,变量的类型由其值和用途决定。

1.1 字符串
字符串是一种非常常见的数据类型。字符串可以是字母、数字、符号等字符的组合。Shell 默认所有的变量都可以是字符串类型,除非我们明确将其当作其他类型(如整数)使用。


1.2 整数
整数通常用于数学运算。Shell本身并没有专门的“整数”类型,但我们可以通过(())语法或let命令进行整数运算。


1.3 数组
Shell支持一维数组,但不支持真正的多维数组。数组索引从 0 开始。

![]()
1.4 布尔值
Shell中没有专门的布尔类型,布尔值通常通过 0(代表 true)和非 0 值(代表 false)来表示。Bash 使用命令的退出状态码来表示布尔值:0 表示成功或 true,其他值表示失败或 false。
1.5 空值
如果一个变量没有被初始化或赋值,则该变量的值为 "空"。如果我们尝试使用未定义的变量,Bash 通常会将其视为空字符串。
二、运算符
2.1 算数运算符
算术运算符用于执行整数数学运算。可以在(())或者$(())中使用。
| 运算符 | 描述 | 示例 |
|---|---|---|
+ | 加法 | ((a + b)) |
- | 减法 | ((a - b)) |
* | 乘法 | ((a * b)) |
/ | 除法 | ((a / b)) |
% | 取余 | ((a % b)) |
++ | 自增 | ((a++)) 或 ((++a)) |
-- | 自减 | ((a--)) 或 ((--a)) |


当然我们也可以使用let或者expr命令。




let命令和expr命令区别如表所示:
| 特性 | let | expr |
|---|---|---|
| 类型 | 内建Shell命令 | 外部命令 |
| 运算符的书写方式 | 不需要空格 | 运算符两边必须有空格 |
| 支持的运算类型 | 整数运算 | 整数运算、字符串操作等 |
| 结果输出 | 无输出(直接修改变量) | 通过命令替换返回结果 |
| 变量引用 | 无需 $,直接使用变量名 | 需要使用 $ 引用变量 |
2.2 关系运算符
关系运算符用于比较数字值。
| 运算符 | 描述 | 示例 |
|---|---|---|
-eq | 等于 | [[ $a -eq $b ]] |
-ne | 不等于 | [[ $a -ne $b ]] |
-lt | 小于 | [[ $a -lt $b ]] |
-le | 小于或等于 | [[ $a -le $b ]] |
-gt | 大于 | [[ $a -gt $b ]] |
-ge | 大于或等于 | [[ $a -ge $b ]] |
2.3 逻辑运算符
2.3.1 与运算
与运算符“&&”用于同时检查多个条件,只有当所有条件都为真时,整体判断才为真。
command1 && aommand2
只有command1成功(返回值为0)时,才会执行command2。也可以用于多条件判断,所有条件成立时,执行后续命令。
对于&&运算我们只需要记住双真则真,一假则假。
2.3.2 或运算
或运算符“||”用于检查多个条件,只要有一个条件为真,整体判断就为真。
command1 || aommand2
对于或运算符我们只需要记住一真则真,双假则假。
2.3.3 非运算
非运算“!”用于取反逻辑,它会反转一个条件的结果。即如果条件为真,则返回假,反之亦然。
!command1
2.4 文件测试运算符
文件测试运算符用于检查文件的属性,如是否存在、是否为目录等:
- -e:判断文件是否存在
- -f:文件是否是常规文件
- -r:文件是否可读
- -w:文件是否可写
- -d:文件是否是目录
- -x:文件是否可执行
- -s:文件是否为非空文件
2.5 字符串比较运算符
字符串比较运算符用于比较两个字符串:
- = 或 ==:用于比较两个字符串是否相等
- !=:用于判断两个字符串是否不相等
- > 或 <:按字典顺序比较
- -z:判断字符串是否为空
- -n:判断字符串是否为非空
2.6 括号 () 和大括号 {} 组合使用
括号()和大括号{}用于控制多个命令的执行顺序。
- 圆括号():在子shell 中执行命令。
- 大括号{}:在当前 shell 中执行命令,命令之间用分号
;分隔。
2.6.1 括号()
括号()在Shell编程中起着多种作用。
1、子 Shell:
使用()可以在子 Shell 中执行一组命令。子 Shell 是一个独立的进程,它有自己的环境,不会影响父 Shell 的环境变量或状态。
例如:
(echo "This is a subshell"; ls)
上述命令在子 Shell 中执行echo和ls命令。即使有环境变量设置变化,也不会影响父 Shell。
2、命令组:
使用圆括号可以将多个命令组合在一起,作为一个整体执行。
(cd /tmp && ls)
上述命令会在子 Shell 中执行cd /temp和ls,但不会影响当前 Shell 的工作目录。
3、后台执行:
当我们将命令放在圆括号中时,可以让整个命令组在后台运行。
(sleep 10; echo "Done") &
上述命令会在后台启动一个子 Shell,执行sleep 10和echo "Done",父 Shell 会继续执行下一个命令。
2.6.2 大括号{}
1、命令组:
使用大括号{}可以将多个命令组合在一起执行,但与圆括号的区别在于,大括号不会启动新的子 Shell。命令将在当前 Shell 中执行。
{ echo "Hello"; echo "World"; }
上述命令将在当前 Shell 中依次执行echo命令,输出Hello和World。
注意:大括号中的命令之间用分号 ; 分隔,且在大括号的两侧必须加上空格或分号。
还需要注意的是命令组里面的命令是按照顺序执行的。
2、参数扩展:
大括号还可以用来进行参数扩展,用于生成多个文件名或字符串。
echo file{1,2,3}.txt
上述命令将输出为:file1.txt file2.txt file3.txt。
在Shell编程中括号()和花括号{}可以结合起来一起使用。
这节教程就先到这里了,更多内容将在后续教程中展示。

1079

被折叠的 条评论
为什么被折叠?



