作者说明 · 学习记录
本站作为作者的学习记录站,不保证文章内容严谨或完全正确。
版权信息

:::warning

本文章为博主原创文章。遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

:::


作为linux嵌入式开发,掌握一些shell脚本的基础是必要的。

1. shell脚本的写法

shell是个纯文本文件,命令从上而下,一行一行开始执行,shell脚本的扩展名为.sh
第一行:

1
#!/bin/bash

表示使用bash

2. shell脚本的一些基本用法

2.1. 输入参数

read常用选项:


2.2. 整形运算

使用$[]进行算数扩展

1
2
read -p "two num: " num1 num2
echo "$num1 + $num2 = $[num1 + num2]"

2.3. test命令

用于查看文件是否存在、权限等信息。可以对数值、字符、文件三方面测试,返回布尔值
格式:

1
2
3
test EXPRESSION
#
[ EXPRESSION ] # 注意方括号内必须有空格

2.3.1. 文件测试

操作符 描述 示例
-e 文件是否存在 [ -e file.txt ]
-f 是普通文件 [ -f /path/to/file ]
-d 是目录 [ -d /path/to/dir ]
-r 可读 [ -r file.txt ]
-w 可写 [ -w file.txt ]
-x 可执行 [ -x script.sh ]
-s 文件大小 >0 [ -s logfile ]
-L 是符号链接 [ -L symlink ]

2.3.2. 字符串比较

操作符 描述 示例
-z STRING 字符串为空 [ -z "$var" ]
-n STRING 字符串非空 [ -n "$var" ]
STRING1 = STRING2 字符串相等 [ "$var1" = "$var2" ]
STRING1 != STRING2 字符串不等 [ "$var1" != "$var2" ]

2.3.3. 数值比较

操作符 描述 示例
-eq 等于 [ "$a" -eq "$b" ]
-ne 不等于 [ "$a" -ne "$b" ]
-gt 大于 [ "$a" -gt "$b" ]
-ge 大于或等于 [ "$a" -ge "$b" ]
-lt 小于 [ "$a" -lt "$b" ]
-le 小于或等于 [ "$a" -le "$b" ]

2.3.4. 逻辑操作符

test 支持逻辑组合:

操作符 描述 示例
! 逻辑非 [ ! -f "$file" ]
-a 逻辑与 [ "$a" -eq 1 -a "$b" -eq 2 ]
-o 逻辑或 [ "$a" -eq 1 -o "$b" -eq 2 ]

现代推荐写法:使用 && 和 || 替代 -a 和 -o,更符合 POSIX 标准


2.4. 条件判断

:::warning
和 Java、PHP 等语言不一样,sh 的流程控制不可为空
:::

这个我单独开一篇算了…

3. 拓展:shell脚本中$的作用

在 Shell 中,$ 是一个非常核心的符号,主要用于变量引用命令替换参数访问字符串操作等。下面按不同用途分类说明:

3.1. 变量引用

$变量名 用于获取变量的值:

1
2
name="lemon"
echo $name # 输出: lemon
1
echo ${name}world   # 输出: lemonworld

3.2. 命令替换

$(command) 会执行 command 命令,并将其标准输出结果替换为字符串:

1
2
echo "Today is $(date)"
# 输出: Today is Wed Jun 18 17:00:00 CST 2025

等价于旧式:`command`

3.3. 位置参数和特殊变量

Shell 脚本中 $ 也用于获取传入脚本的参数或特殊含义变量:

表达式 含义
$0 脚本名
$1 ~ $9 脚本参数(第1~9个)
$@ 所有参数(独立)
$* 所有参数(整体)
$# 参数个数
$$ 当前脚本/进程的 PID
$? 上一个命令的返回值
$! 最近一个后台进程的 PID

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash

echo "【\$0】:脚本名称:$0"
echo "【\$1】:第一个参数:$1"
echo "【\$2】:第二个参数:$2"
echo "【\$#】:参数总数:$#"

echo "【\$@】:所有参数(逐个显示)"
for arg in "$@"; do
echo " - $arg"
done
# echo "【\$@】:所有参数:" "$@"
echo "【\$*】:所有参数(整体显示)"
for arg in "$*"; do
echo " - $arg"
done

echo "【\$$】:当前脚本的 PID 是:$$"

# 模拟一个命令并查看返回值
echo "执行 ls 命令:"
ls > /dev/null
echo "【\$?】:上一个命令的退出状态码:$?"

# 模拟后台命令并查看其 PID
sleep 5 &
echo "【\$!】:最近一个后台任务的 PID 是:$!"

常见问题:${@}${*}的区别

表达式 解释
"${@}" 把每个参数作为独立字符串处理,适合 for 循环
"${*}" 把所有参数当作一个整体字符串处理,若带引号会合并成一个参数

3.4. 算术扩展

$(())$[] 进行算术运算:

1
2
3
a=5
b=3
echo $[a + b] # 输出: 8

3.5. 字符串操作和默认值处理

支持 :-, :=, :+, :? 等操作:

1
echo ${var:-default}   # var未定义则使用"default"

shell脚本入门

创建时间:6月 18, 2025

最后更新:6月 18, 2025

字数统计:1.3k字

预计阅读:5min

文章分类: -Linux -Shell