Appearance
语法检查
bash
bash -n script.sh
作用:只检查语法不执行
执行过程追踪
bash
bash -x script.sh
输出示例:
+ echo 'Hello World'
Hello World
作用:显示每条命令执行过程
分步执行
bash
# 在脚本中插入
set -e # 遇到错误立即退出
set -o pipefail # 管道命令失败时退出
文件判断符号
符号 | 含义 | 示例 |
---|---|---|
-d | 是否为目录 | [ -d /tmp ] && echo "是目录" |
-f | 是否为普通文件 | `[ -f file.txt ] |
-e | 文件/目录是否存在 | if [ -e /path ]; then... |
-s | 文件存在且不为空 | [ -s log.txt ] && cat log.txt |
数值比较运算符
bash
[ $a -gt $b ] # > 大于
[ $a -lt $b ] # < 小于
[ $a -eq $b ] # == 等于
[ $a -ne $b ] # != 不等于
[ $a -ge $b ] # >= 大于等于
[ $a -le $b ] # <= 小于等于
注意:在(())中可直接用数学符号:(( a > b ))
脚本计算
- expr
- let
- $(())
- bc
if判断与[]条件判断差异
- 方括号的使用:在使用
[
或[[
时,通常需要在条件的两端留有空格,例如[ $a -eq $b ]
。而在使用[[
时,这种空格是可选的,这使得它更容易阅读和书写。例如[[ $a -eq $b ]]
。 - 功能增强:
[[
比[
提供了更多的功能和灵活性,比如模式匹配(使用=~
操作符)和字符串比较时无需引号包围变量等。
bash
# if与[]的区别:
if语句是bash(和其他一些shell,如sh)中的基本控制结构之一,用于根据条件执行代码块
if [ -f file ] # []是test命令的另一种形式,需要空格
if [[ $str == *pattern* ]] # 支持通配符匹配
# 现代脚本推荐使用:
[[ -e path ]] && cmd # 双中括号更安全
控制结构语法
if语句
bash
if [ condition ]; then
commands
elif [ condition2 ]; then
commands
else
commands
fi
循环结构
bash
# for循环
for i in {1..5}; do echo $i; done
# while按行读取
while IFS= read -r line; do
echo "$line"
done < file.txt
# 死循环
while true; do
date
sleep 1
done
case语句
bash
case $var in
start) echo "Starting..." ;;
stop) echo "Stopping..." ;;
*) echo "Unknown command" ;;
esac
函数定义
bash
function_name() {
local var="value" # 局部变量
return $?
}
流程控制关键字
关键字 | 作用范围 | 示例 |
---|---|---|
exit | 终止整个脚本 | [ -z $1 ] && exit 1 |
return | 退出函数 | return 0 |
break | 跳出当前循环 | while true; do break; done |
continue | 跳过本次循环 | for i in {1..3}; do continue; echo $i; done |