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”
,现在它可以工作了!非常感谢。你能再解释一遍“陷阱”吗?我看不出这会出什么问题?你是说如果有钥匙但没有价值?