Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BASH从.properties文件中读取所有键不会';不显示最后一个键_Bash_Shell - Fatal编程技术网

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

BASH从.properties文件中读取所有键不会';不显示最后一个键,bash,shell,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}

我有一个
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
如您所见,
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可能有也可能没有尾随空间,不管是否有尾随回车符。想法?

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

while IFS== read key value ; do
    if [[ -z $key ]] ; then
        continue
    fi
    echo "$key : $value"
done < <(cat file; echo)
而IFS==读取键值;做
如果[-z$key]];然后
持续
fi
echo“$key:$value”

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

while IFS== read key value ; do
    if [[ -z $key ]] ; then
        continue
    fi
    echo "$key : $value"
done < <(cat file; echo)
而IFS==读取键值;做
如果[-z$key]];然后
持续
fi
echo“$key:$value”
完成<我已经投票了,这是另一个变体:

while IFS== read key value || [[ -n "$value" ]]
do
    echo "$key : $value"
done < "$file"
而IFS==读取键值| |[[-n“$value”]]
做
echo“$key:$value”
完成<“$file”
换句话说,如果
read
返回0或
read
能够读取非空行,但在其他情况下失败,
do
。从这个意义上讲,它更简短,更清晰

然而,上面的代码有一个缺陷。理想的实现应该将
while
语句评估为true,当且仅当以下一项为true时:

  • 读取
    成功,因此必须填充
  • 读取
    在填充
    后失败,特别是因为达到了EOF
  • 将此与上面的实现进行比较,如果第一个条件为true或
    read
    由于任何原因失败,则
    while
    语句的计算结果为true,前提是之后填充了
    value
    。这些原因在
    帮助阅读
    中描述:

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

    这甚至可能不是一份详尽的清单。这意味着,如果(例如)读取输入文件时出错,但
    read
    未清除变量或在出现此类错误时重新填充变量,则代码将忽略这一更严重的错误情况,并继续执行,就好像没有发生任何异常情况一样。这种对错误条件的粗心处理可能会导致极难调试的问题,即使是在这样一段简单的代码中,这也是一个原因。

    我已经投票了,这是另一个变体:

    while IFS== read key value || [[ -n "$value" ]]
    do
        echo "$key : $value"
    done < "$file"
    
    而IFS==读取键值| |[[-n“$value”]]
    做
    echo“$key:$value”
    完成<“$file”
    
    换句话说,如果
    read
    返回0或
    read
    能够读取非空行,但在其他情况下失败,
    do
    。从这个意义上讲,它更简短,更清晰

    然而,上面的代码有一个缺陷。理想的实现应该将
    while
    语句评估为true,当且仅当以下一项为true时:

  • 读取
    成功,因此必须填充
  • 读取
    在填充
    后失败,特别是因为达到了EOF
  • 将此与上面的实现进行比较,如果第一个条件为true或
    read
    由于任何原因失败,则
    while
    语句的计算结果为true,前提是之后填充了
    value
    。这些原因在
    帮助阅读
    中描述:

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


    这甚至可能不是一份详尽的清单。这意味着,如果(例如)读取输入文件时出错,但
    read
    未清除变量或在出现此类错误时重新填充变量,则代码将忽略这一更严重的错误情况,并继续执行,就好像没有发生任何异常情况一样。这种对错误条件的粗心处理可能导致极难调试的问题,即使是在这样一段简单的代码中,这也是一个原因。

    一个有效的POSIX文本文件总是以换行结束
    web.properties
    显然没有。@chepner我不知道。不幸的是,intelliJ IDEA很容易不以换行结束
    web.properties
    显然没有。@chepner我不知道。不幸的是,intelliJ IDEA很容易不以换行符结尾。不能让它运行。我的输出:找到文件。/test.sh:file:没有这样的文件或目录将最后一行更改为
    done<“$file”
    ,现在它可以工作了!非常感谢。你能再解释一遍“陷阱”吗?我看不出这会出什么问题?你是说如果有钥匙但没有价值吗?嗯,不能让它运行。我的输出:找到文件。/test.sh:file:没有这样的文件或目录将最后一行更改为
    done<“$file”
    ,现在它可以工作了!非常感谢。你能再解释一遍“陷阱”吗?我看不出这会出什么问题?你是说如果有钥匙但没有价值?