BASH从.properties文件中读取所有键不会显示最后一个键

sta*_*cks 1 bash shell

我有一个web.properties包含一堆键值的文件.

FIRST="true"
SECOND="true"
THIRD="true"
Run Code Online (Sandbox Code Playgroud)

我正在编写一个bash脚本来显示web.properties文件中的所有键

myscript.sh

file="web.properties"

if [ -f "$file" ]; then
  echo "file found"

  while IFS='=' read -r key value
  do
    echo "Found ${key}"
  done < "$file"
  else
  echo "$file not found."
fi
Run Code Online (Sandbox Code Playgroud)

输出:

FIRST
SECOND
Run Code Online (Sandbox Code Playgroud)

如你所见,THIRD被遗漏了.如果我修改我的web.properties文件以获得额外的回报

web.properties

FIRST="true"
SECOND="true"
THIRD="true"
//stackoverflow doesn't allow me to do an empty line in code formatting, so pretend this doesn't exist
Run Code Online (Sandbox Code Playgroud)

我的输出是:

FIRST
SECOND
THIRD
Run Code Online (Sandbox Code Playgroud)

我希望我的bash脚本能够在两种情况下工作,因为文件是以编程方式和手动方式编辑的,因此IDE可能有也可能没有该尾随空格.使用尾随回车或没有它.思考?

cho*_*oba 5

每次在末尾输出一个额外的换行符,忽略空行:

while IFS== read key value ; do
    if [[ -z $key ]] ; then
        continue
    fi
    echo "$key : $value"
done < <(cat file; echo)
Run Code Online (Sandbox Code Playgroud)


l0b*_*0b0 5

我已经赞成了@ choroba的答案,这是另一种变体:

while IFS== read key value || [[ -n "$value" ]]
do
    echo "$key : $value"
done < "$file"
Run Code Online (Sandbox Code Playgroud)

换句话说,如果read返回0 或者 read能够读取非空行但是否则失败,do.从这个意义上讲,它更短,IMO更清晰.

但是,上面的代码有一个问题.while当且仅当以下之一为真时,理想的实现应该将语句评估为true:

  1. read成功,因此必须填充keyvalue.
  2. read填充后失败key,value特别是因为达到了EOF.

将此与上述实现进行比较,while如果第一个条件为真,则将语句计算为true,或者只要之后填充,任何原因read都会失败.这些原因描述如下:valuehelp read

返回代码为零,除非遇到文件结束,读取超时(在这种情况下大于128),发生变量赋值错误,或者提供无效的文件描述符作为-u的参数.

这甚至可能不是一个详尽的清单.这意味着,如果(例如)读取输入文件时出错,但read要么不清除变量或者在出现此类错误时重新填充变量,那么代码将忽略这个更严重的错误条件并继续,就像没有发生任何不幸事件.这种对错误条件的粗心处理可能导致极难调试问题,即使在如此简单的代码片段中也是如此,这也是Bash完全不适用于任何复杂问题的原因之一.