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
相关产品推荐
相关产品推荐

