#bash
在 Bash 中,if
条件判断可以使用多种不同的括号形式,每种形式有不同的作用和语法规则:
1. if [ ]
– 传统的 test 命令
[ ]
是 test
命令的另一种形式([
是一个内置命令,需要以 ]
结尾)
- 兼容性最好,可在所有 POSIX shell 中使用
- 需要严格的语法(如变量引用要加引号,运算符两边要有空格)
示例:
if [ "$var" -eq 10 ]; then
echo "var is 10"
fi
if [ -f "file.txt" ]; then
echo "file exists"
fi
特点:
– 不支持 &&
和 ||
(要用 -a
和 -o
)
– 不支持正则匹配
– 字符串比较用 =
或 !=
– 数值比较用 -eq
, -ne
, -lt
, -gt
等
2. if [[ ]]
– Bash 增强版条件表达式
[[ ]]
是 Bash 的关键字(不是命令),提供更多功能
- 只在 Bash 和其他现代 shell(如 Zsh、Ksh)中可用
- 语法更灵活,更安全(不需要严格引用变量)
示例:
if [[ $var == 10 ]]; then
echo "var is 10"
fi
if [[ "$str" == *.txt ]]; then
echo "str ends with .txt"
fi
if [[ $var -gt 5 && $var -lt 15 ]]; then
echo "var is between 5 and 15"
fi
特点:
– 支持 &&
和 ||
逻辑运算符
– 支持正则匹配 =~
– 支持模式匹配 ==
(如 *.txt
)
– 字符串比较可以用 ==
或 !=
– 不需要对变量严格加引号(但仍建议加)
3. if (( ))
– 算术运算
(( ))
用于算术运算和比较
- 如果算术表达式的结果非零(true),则返回 0(成功)
- 只在 Bash 和其他现代 shell 中可用
示例:
if (( $var == 10 )); then
echo "var is 10"
fi
if (( var > 5 && var < 15 )); then
echo "var is between 5 and 15"
fi
if (( count++ > 10 )); then
echo "count is now greater than 10"
fi
特点:
– 使用类似 C 语言的算术运算符(==
, !=
, >
, <
, >=
, <=
)
– 支持 ++
, --
, +=
等自增/自减操作
– 变量可以不加 $
前缀(但建议加上以提高可读性)
– 不支持字符串操作,纯数值计算
总结比较
特性 |
[ ] (test) |
[[ ]] |
(( )) |
用途 |
基本条件测试 |
增强条件测试 |
算术运算 |
逻辑运算符 |
-a , -o |
&& , ` |
|
字符串比较 |
= , != |
== , != |
不支持 |
数值比较 |
-eq , -ne |
-eq , -ne |
== , != , > , < |
模式匹配 |
不支持 |
支持 (== , =~ ) |
不支持 |
变量引用 |
必须加引号 |
可不加引号 |
可不加 $ |
POSIX 兼容 |
是 |
否 |
否 |
推荐用法
- 需要兼容 POSIX shell(如
/bin/sh
)时用 [ ]
- 在 Bash 脚本中优先使用
[[ ]]
进行条件测试
- 进行算术比较时用
(( ))
- 避免混合使用这些语法(比如不要在
[[ ]]
中使用 -eq
)
Bash脚本中if条件判断用法解析
#bash
在 Bash 脚本中,if [ false ]; then ... fi
的行为可能和你预期的不一样。让我解释一下:
问题分析
当你写 if [ false ]; then ... fi
时,实际上发生的是:
[ false ]
是一个 test 命令([
是 test
命令的别名)
- 它检查字符串 “false” 是否非空
- 因为 “false” 是一个非空字符串,所以 test 命令返回 true(退出状态码 0)
正确写法
如果你想要检查一个命令的返回状态(比如 false
命令),应该这样写:
if false; then
echo "This won't execute"
else
echo "This will execute"
fi
或者如果你想使用 test 命令检查布尔条件:
if [ "$var" = false ]; then
echo "var is the string 'false'"
fi
其他常见用法
检查命令是否成功:
if some_command; then
echo "Command succeeded"
fi
检查变量是否为真值:
if [ "$var" = true ]; then
echo "var is true"
fi
使用算术比较:
if (( 1 == 1 )); then
echo "Math is correct"
fi
记住在 Bash 中,true
和 false
实际上是命令(返回 0 和非 0 退出状态),而不是布尔值。
TypeScript 中fetch请求的错误处理
#typescript
在 TypeScript 中,使用 fetch
进行异步请求后,你需要检查响应状态码和内容,然后根据情况处理错误或正常数据。以下是一个完整的示例:
async function fetchData(url: string): Promise<any> {
try {
const response = await fetch(url);
// 首先检查HTTP状态码
if (!response.ok) {
// 尝试解析错误消息(假设返回的是JSON格式的错误信息)
let errorData;
try {
errorData = await response.json();
} catch (e) {
// 如果无法解析为JSON,则使用状态文本
throw new Error(`HTTP error! status: ${response.status}, message: ${response.statusText}`);
}
// 抛出包含服务器错误信息的错误
throw new Error(errorData.message || `Request failed with status ${response.status}`);
}
// 如果状态码正常,解析返回的数据
const data = await response.json();
return data;
} catch (error) {
// 捕获网络错误或其他异常
console.error('Fetch error:', error);
throw error; // 可以选择重新抛出或处理错误
}
}
// 使用示例
(async () => {
try {
const result = await fetchData('https://api.example.com/data');
console.log('Success:', result);
// 在这里处理正常数据
} catch (error) {
console.error('Error:', error.message);
// 在这里处理错误
}
})();
关键点说明:
- 检查响应状态:
response.ok
检查状态码是否在 200-299 范围内
- 错误处理:
- 首先检查HTTP状态码
- 尝试解析错误响应体(假设是JSON格式)
- 如果解析失败,回退到状态文本
- 成功响应:
- 异常捕获:
更严格的类型版本:
如果你想使用更严格的类型,可以这样写:
interface ApiResponse<T> {
data?: T;
error?: {
code: number;
message: string;
};
}
async function fetchData<T>(url: string): Promise<T> {
// ... 同上,但返回类型为 Promise<T>
}
这样你可以获得更好的类型安全性和IDE支持。