You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本:检查参数已设置且不等于指定值的方法

解决Shell函数中参数存在性与数值比较的报错问题

问题核心

你遇到的错误是因为空变量处理不当:当$1为空时,[ -n $1 ]会被解析为[ -n ],bash会把-n当作非空字符串判断为true,进而执行后面的[ $1 -eq $i ],此时$1为空导致表达式变成[ -eq $i ],缺少左操作数,触发[: -eq: unary operator expected错误。

下面给出几种可行的解决方案,分可移植和bash专属两种场景:

方案1:POSIX兼容写法(推荐,跨shell通用)

通过引号包裹变量确保空值判断准确,同时利用逻辑短路避免无效的数值比较:

check_endpoints() {
  for (( i=0; i < $ENDPOINTS; i+=1 )); do
    # 先判断参数非空,再比较数值
    if [ -n "$1" ] && [ "$1" -eq "$i" ]; then
      echo "跳过下线的端点 $i"
      continue  # 跳过当前循环,不执行检查逻辑
    fi
    # 这里放curl查询端点、处理结果的代码
    echo "检查端点 $i"
  done
}

如果要更严谨地判断是否传递了参数(而非参数是否非空),可以用参数个数$#判断:

check_endpoints() {
  for (( i=0; i < $ENDPOINTS; i+=1 )); do
    if [ $# -ge 1 ] && [ "$1" -eq "$i" ]; then
      echo "跳过下线的端点 $i"
      continue
    fi
    # curl检查逻辑
    echo "检查端点 $i"
  done
}

方案2:Bash专属写法(简洁但不跨shell)

利用bash的[[关键字,它会自动处理空变量的分词问题,不需要额外加引号:

check_endpoints() {
  for (( i=0; i < $ENDPOINTS; i+=1 )); do
    if [[ -n $1 && $1 -eq $i ]]; then
      echo "跳过下线的端点 $i"
      continue
    fi
    # curl检查逻辑
    echo "检查端点 $i"
  done
}

注意:这种写法仅在bash中有效,无法在POSIX sh、dash等严格遵循标准的shell中运行。

错误原因拆解

你之前的[ -n $1 ]在$1为空时,会被展开为[ -n ]。bash中test(即[命令)如果只有一个参数,会判断该参数是否为非空字符串——-n本身是一个非空字符串,所以判断返回true,导致后续的数值比较执行。而$1为空时,[ $1 -eq $i ]会变成[ -eq $i ],缺少左操作数,最终触发报错。

内容的提问来源于stack exchange,提问作者phetherer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:03:32