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

时间:2018-04-10 21:59:57

标签: bash shell

我有一个web.properties文件,其中包含一堆键值。

FIRST="true"
SECOND="true"
THIRD="true"

我正在编写一个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

输出:

FIRST
SECOND

如您所见,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

我的输出是:

FIRST
SECOND
THIRD

我希望我的bash脚本能够在两个场景中工作,因为文件是以编程方式和手动方式编辑的,因此IDE可能会或者可能没有该尾随空格。使用尾随回车或没有它。想法?

2 个答案:

答案 0 :(得分:5)

我已经赞成@choroba's answer,这是另一种变体:

while IFS== read key value || [[ -n "$value" ]]
do
    echo "$key : $value"
done < "$file"

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

然而,上面的代码有一个问题。当且仅当满足以下条件之一时,理想的实现应将while语句评估为true:

  1. read成功,因此必须填充keyvalue
  2. read在填充keyvalue之后失败,因为已达到EOF。
  3. 将此与上述实现相比较,如果第一个条件为真,或while因任何原因{em>> > read,则将value语句评估为真{/ 1}之后填充了。 help read

    中描述了这些原因
      

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

    这甚至可能不是一个详尽的清单。这意味着如果(例如)读取输入文件时出错,但read要么不清除变量,要么在出现此类错误时重新填充变量,那么代码将忽略这个更严重的错误状况,并继续好像没有发生任何不幸事件。这种对错误条件的粗心处理可能导致极难调试问题,即使是在如此简单的代码中也是如此,这是Bash is completely unsuitable for anything complex的一个原因。

答案 1 :(得分:4)

每次最后输出一个额外的换行符,忽略空行:

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