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

Shell脚本逐行读取文件无法跳过空行问题求助

解决Bash脚本读取空行时的异常问题

你的问题核心出在空行处理顺序错误导致的参数展开异常上:当遇到空行时,${TEST_CASE:0:1}这个表达式会触发Bash报错——空字符串没有第0个字符,这才是你看到的异常根源,而不是空行判断本身失效。

修正后的完整代码示例

countNumberOfCases() {
    echo "2. Counting number of test cases -----------"
    cd "$SCRIPT_EXECUTION_DIR"
    FILE_NAME="Features"
    TEST_CASE_COUNT=0  # 初始化测试用例计数器

    while read line || [[ -n "$line" ]]; do
        # 第一步:先跳过空行,避免后续参数展开报错
        if [[ -z "$line" ]]; then
            continue
        fi
        
        TEST_CASE="$line"
        # 第二步:跳过以#开头的注释行
        if [[ "${TEST_CASE:0:1}" != "#" ]]; then
            ((TEST_CASE_COUNT++))
            cd "$MVN_EXECUTION_DIR"
            runTestCase "$TEST_CASE"
            # 执行完用例后切回原目录,避免后续循环路径混乱
            cd "$SCRIPT_EXECUTION_DIR"
        fi
    done < "$FILE_NAME"

    echo "Total valid test cases: $TEST_CASE_COUNT"
}

关键改动说明

  1. 调整判断顺序:把空行判断放在最前面,空行直接跳过后续逻辑,彻底避免空字符串触发${TEST_CASE:0:1}的参数展开错误。
  2. 变量加引号包裹:所有路径变量(比如$SCRIPT_EXECUTION_DIR)都用双引号包裹,防止路径含空格时出现解析错误,这是Bash脚本的标准最佳实践。
  3. 新增计数器:补上了统计行数的核心逻辑,用TEST_CASE_COUNT记录有效测试用例的数量。
  4. 目录回退处理:执行runTestCase后切回初始目录,避免循环后续读取文件时路径出错。

为什么你之前的判断没生效?

你尝试的[ -z "$line" ]本身是对的,但大概率是把这个判断放在了${TEST_CASE:0:1}之后——空行已经触发了参数展开报错,根本没走到空行判断的逻辑里,调整顺序就能解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:55:00