我有一个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可能会或者可能没有该尾随空格。使用尾随回车或没有它。想法?
答案 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:
read
成功,因此必须填充key
和value
。read
在填充key
和value
之后失败,因为已达到EOF。将此与上述实现相比较,如果第一个条件为真,或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)