作为linux嵌入式开发,掌握一些shell脚本的基础是必要的。
1. shell脚本的写法
shell是个纯文本文件,命令从上而下,一行一行开始执行,shell脚本的扩展名为.sh
第一行:
#!/bin/bash
表示使用bash
2. shell脚本的一些基本用法
2.1. 输入参数
read常用选项:
- -a array 将输入的值作为数组赋值
- -d delim 指定输入结束的标识符
- -p prompt 在输入前打印提示信息
- -t timeout 设置超时时间
- -e 在输入的时候可以使用命令补全
- -s silent 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
2.2. 整形运算
使用$[]进行算数扩展
read -p "two num: " num1 num2
echo "$num1 + $num2 = $[num1 + num2]"
2.3. test命令
用于查看文件是否存在、权限等信息。可以对数值、字符、文件三方面测试,返回布尔值
格式:
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. 变量引用
$变量名 用于获取变量的值:
name="lemon"
echo $name # 输出: lemon
echo ${name}world # 输出: lemonworld
3.2. 命令替换
$(command) 会执行 command 命令,并将其标准输出结果替换为字符串:
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 |
示例:
#!/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. 算术扩展
用 $(()) 或 $[] 进行算术运算:
a=5
b=3
echo $[a + b] # 输出: 8
3.5. 字符串操作和默认值处理
支持 :-, :=, :+, :? 等操作:
echo ${var:-default} # var未定义则使用"default"