nwall

#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 时,实际上发生的是:

  1. [ false ] 是一个 test 命令([test 命令的别名)
  2. 它检查字符串 “false” 是否非空
  3. 因为 “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

其他常见用法

  1. 检查命令是否成功:

    if some_command; then
    echo "Command succeeded"
    fi
    
  2. 检查变量是否为真值:

    if [ "$var" = true ]; then
    echo "var is true"
    fi
    
  3. 使用算术比较:

    if (( 1 == 1 )); then
    echo "Math is correct"
    fi
    

记住在 Bash 中,truefalse 实际上是命令(返回 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);
    // 在这里处理错误
  }
})();

关键点说明:

  1. 检查响应状态response.ok 检查状态码是否在 200-299 范围内
  2. 错误处理
    • 首先检查HTTP状态码
    • 尝试解析错误响应体(假设是JSON格式)
    • 如果解析失败,回退到状态文本
  3. 成功响应
    • 解析JSON格式的响应体
  4. 异常捕获
    • 捕获网络错误或其他异常

更严格的类型版本:

如果你想使用更严格的类型,可以这样写:

interface ApiResponse<T> {
  data?: T;
  error?: {
    code: number;
    message: string;
  };
}

async function fetchData<T>(url: string): Promise<T> {
  // ... 同上,但返回类型为 Promise<T>
}

这样你可以获得更好的类型安全性和IDE支持。