bash脚本的基础
参数和变量
参数 | 含义 |
---|---|
$0 |
当前脚本的名字(或调用脚本时使用的命令) |
$1 |
第1个参数 |
$2 … |
第2、3、4…参数,以此类推 |
$# |
脚本传递参数的个数 |
$@ |
脚本传递的全部参数,以列表形式展开 |
$* |
脚本传递的全部参数,作为单个字符串展开 |
$? |
最近一条命令的退出状态(0 表示成功,非 0 表示失败) |
$$ |
当前脚本的进程 ID |
$! |
最近一条在后台执行的命令的PID |
$_ |
上一条命令最后一个参数 |
比较运算符
类型 | 运算符 | 意义 | 示例 |
---|---|---|---|
数字比较 | -eq |
等于 | [ $a -eq $b ] |
-ne |
不等于 | [ $a -ne $b ] |
|
-gt |
大于 | [ $a -gt $b ] |
|
-ge |
大于等于 | [ $a -ge $b ] |
|
-lt |
小于 | [ $a -lt $b ] |
|
-le |
小于等于 | [ $a -le $b ] |
|
字符串比较 | = |
相等 | [ "$a" = "$b" ] |
!= |
不相等 | [ "$a" != "$b" ] |
|
-z |
空字符串 | [ -z "$a" ] |
|
-n |
非空字符串 | [ -n "$a" ] |
|
文件检测 | -e |
文件是否存在 | [ -e /path/to/file ] |
-f |
文件是否为普通文件 | [ -f /path/to/file ] |
|
-d |
文件是否为目录 | [ -d /path/to/dir ] |
|
-r |
文件是否可读 | [ -r /path/to/file ] |
|
-w |
文件是否可写 | [ -w /path/to/file ] |
|
-x |
文件是否可执行 | [ -x /path/to/file ] |
控制结构
if 判断结构
1 | if [ 条件 ]; then |
示例:
1 | num=5 |
其他(通用):
- break:退出当前循环。
- continue:跳过当前迭代,进入下次循环。
for 循环结构
1 | for i in 1 2 3; do |
示例(列表):
1 | fruits=("apple" "banana" "orange") |
while 循环结构
1 | count=1 |
until 循环
和 while 相反,当条件为 false时持续执行:
1 | count=1 |
用途:适合循环直到某个条件成立
select 菜单结构
让脚本提供简单的菜单:
1 | select option in "Apple" "Banana" "Quit"; do |
用途:适合脚本做简单交互
使用 getopts 做参数解析
让脚本接受参数选项,例如:
1 | while getopts "a:b:c" opt; do |
用途:脚本参数更灵活,更标准化
case 结构
1 | read -p "请输入一个颜色: " color |
函数定义和调用
1 | my_func() { |
用途:封装代码片段、结构化脚本
脚本退出和错误检测
1 | exit 0 # 正常退出 |
重定向和管道
-
重定向:
1
2
3
4command > file.txt # 覆盖
command >> file.txt # 追加
command 2> error.txt # 错误重定向
command > all.txt 2>&1 # 标准和错误全部重定向 -
管道:
1
ps aux | grep bash # 将 ps 的结果传递给 grep
脚本参数处理
-
检查是否提供参数:
1
2
3
4if [ $# -lt 1 ]; then
echo "Usage: $0 <param1> [param2...]"
exit 1
fi -
获取参数:
1
2
3for arg in "$@"; do
echo "参数: $arg"
done
错误检测和脚本退出控制
检查命令是否存在
1 | if ! command -v curl &> /dev/null; then |
检查命令是否成功
每个命令执行完都有一个退出状态:
0
表示成功。- 非
0
表示失败。
示例:
1 | mkdir mydir |
检查脚本参数是否完整
在脚本一开始检查参数:
1 | if [ $# -lt 1 ]; then |
检查命令是否存在
检查某命令是否已安装:
1 | if ! command -v curl &> /dev/null; then |
严格错误检查
用脚本开头加:
1 | set -euo pipefail |
-e
:检测错误,脚本出错立刻退出。-u
:检测使用未定义变量。-o pipefail
:检测管道中任一命令失败时让脚本退出。
完成后释放资源
用 trap
在脚本退出时做收尾:
1 | temp_file=$(mktemp) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HAHA!