假设我有以下Bash脚本:
while read SCRIPT_SOURCE_LINE; do
echo "$SCRIPT_SOURCE_LINE"
done
我注意到对于没有换行符的文件,这会有效地跳过最后一行。
我在搜索解决方案时找到了这个:
当读到文件末尾而不是行末时,它确实会读取数据并将其分配给变量,但它会以非零状态退出。如果您的循环构造为“while read; do stuff; done”,则会出现这种情况。
因此,不要直接测试读取退出状态,而是测试一个标志,并让read命令从循环体内设置该标志。无论reads退出状态如何,整个循环体都会运行,因为read只是循环中的命令列表之一,而不是决定循环是否完全运行的决定因素。
DONE=false
until $DONE ;do
read || DONE=true
# process $REPLY here
done < /path/to/file.in
我该如何重写这个解决方案,使其与我之前使用的 while 循环完全相同,即不需要硬编码输入文件的位置?
/bin/sh
),请执行IFS='' read -r LINE || [ -n "$LINE" ]
。 - Richard Hansen