作为linux嵌入式开发,掌握一些shell脚本的基础是必要的。
shell是个纯文本文件,命令从上而下,一行一行开始执行,shell脚本的扩展名为.sh
第一行:
1 |
|
表示使用bash
read
常用选项:
使用$[]
进行算数扩展
1 |
|
用于查看文件是否存在、权限等信息。可以对数值、字符、文件三方面测试,返回布尔值
格式:
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 ] |
操作符 | 描述 | 示例 |
---|---|---|
-z STRING | 字符串为空 | [ -z "$var" ] |
-n STRING | 字符串非空 | [ -n "$var" ] |
STRING1 = STRING2 | 字符串相等 | [ "$var1" = "$var2" ] |
STRING1 != STRING2 | 字符串不等 | [ "$var1" != "$var2" ] |
操作符 | 描述 | 示例 |
---|---|---|
-eq | 等于 | [ "$a" -eq "$b" ] |
-ne | 不等于 | [ "$a" -ne "$b" ] |
-gt | 大于 | [ "$a" -gt "$b" ] |
-ge | 大于或等于 | [ "$a" -ge "$b" ] |
-lt | 小于 | [ "$a" -lt "$b" ] |
-le | 小于或等于 | [ "$a" -le "$b" ] |
test
支持逻辑组合:
操作符 | 描述 | 示例 |
---|---|---|
! | 逻辑非 | [ ! -f "$file" ] |
-a | 逻辑与 | [ "$a" -eq 1 -a "$b" -eq 2 ] |
-o | 逻辑或 | [ "$a" -eq 1 -o "$b" -eq 2 ] |
现代推荐写法:使用 &&
和 ||
替代 -a
和 -o
,更符合 POSIX 标准
:::warning
和 Java、PHP 等语言不一样,sh 的流程控制不可为空
:::
这个我单独开一篇算了…
$
的作用在 Shell 中,$
是一个非常核心的符号,主要用于变量引用、命令替换、参数访问、字符串操作等。下面按不同用途分类说明:
$变量名
用于获取变量的值:
1 |
|
1 |
|
$(command)
会执行 command
命令,并将其标准输出结果替换为字符串:
1 |
|
等价于旧式:`command`
Shell 脚本中 $
也用于获取传入脚本的参数或特殊含义变量:
表达式 | 含义 |
---|---|
$0 |
脚本名 |
$1 ~ $9 |
脚本参数(第1~9个) |
$@ |
所有参数(独立) |
$* |
所有参数(整体) |
$# |
参数个数 |
$$ |
当前脚本/进程的 PID |
$? |
上一个命令的返回值 |
$! |
最近一个后台进程的 PID |
示例:
1 |
|
常见问题:${@}
与 ${*}
的区别
表达式 | 解释 |
---|---|
"${@}" |
把每个参数作为独立字符串处理,适合 for 循环 |
"${*}" |
把所有参数当作一个整体字符串处理,若带引号会合并成一个参数 |
用 $(())
或 $[]
进行算术运算:
1 |
|
支持 :-
, :=
, :+
, :?
等操作:
1 |
|