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" }
关键改动说明
- 调整判断顺序:把空行判断放在最前面,空行直接跳过后续逻辑,彻底避免空字符串触发
${TEST_CASE:0:1}的参数展开错误。 - 变量加引号包裹:所有路径变量(比如
$SCRIPT_EXECUTION_DIR)都用双引号包裹,防止路径含空格时出现解析错误,这是Bash脚本的标准最佳实践。 - 新增计数器:补上了统计行数的核心逻辑,用
TEST_CASE_COUNT记录有效测试用例的数量。 - 目录回退处理:执行
runTestCase后切回初始目录,避免循环后续读取文件时路径出错。
为什么你之前的判断没生效?
你尝试的[ -z "$line" ]本身是对的,但大概率是把这个判断放在了${TEST_CASE:0:1}之后——空行已经触发了参数展开报错,根本没走到空行判断的逻辑里,调整顺序就能解决问题。
内容的提问来源于stack exchange,提问作者Durgesh
相关产品推荐
相关产品推荐

