我有一个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可能有也可能没有该尾随空格.使用尾随回车或没有它.思考?
每次在末尾输出一个额外的换行符,忽略空行:
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)
我已经赞成了@ 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:
read成功,因此必须填充key和value.read填充后失败key,value特别是因为达到了EOF.将此与上述实现进行比较,while如果第一个条件为真,则将语句计算为true,或者只要之后填充,任何原因read都会失败.这些原因描述如下:valuehelp read
返回代码为零,除非遇到文件结束,读取超时(在这种情况下大于128),发生变量赋值错误,或者提供无效的文件描述符作为-u的参数.
这甚至可能不是一个详尽的清单.这意味着,如果(例如)读取输入文件时出错,但read要么不清除变量或者在出现此类错误时重新填充变量,那么代码将忽略这个更严重的错误条件并继续,就像没有发生任何不幸事件.这种对错误条件的粗心处理可能导致极难调试问题,即使在如此简单的代码片段中也是如此,这也是Bash完全不适用于任何复杂问题的原因之一.