假设我有以下Bash脚本:
while read SCRIPT_SOURCE_LINE; do
echo "$SCRIPT_SOURCE_LINE"
done
Run Code Online (Sandbox Code Playgroud)
我注意到,对于最后没有换行的文件,这将有效地跳过最后一行.
我一直在寻找解决方案,并发现了这个:
当读取到达文件结尾而不是行尾时,它会读入数据并将其分配给变量,但它会以非零状态退出.如果你的循环是"在阅读时构建的;做的事情;完成
因此,不是直接测试读取退出状态,而是测试一个标志,并让read命令在循环体内设置该标志.这样,无论读取退出状态如何,整个循环体都会运行,因为读取只是循环中的命令列表之一,就像其他任何循环一样,而不是决定循环是否会运行的决定因素.
Run Code Online (Sandbox Code Playgroud)DONE=false until $DONE ;do read || DONE=true # process $REPLY here done < /path/to/file.in
如何重写此解决方案,使其行为与while我之前的循环完全相同,即没有硬编码输入文件的位置?
Ada*_*zak 39
我使用以下构造:
while IFS= read -r LINE || [[ -n "$LINE" ]]; do
echo "$LINE"
done
Run Code Online (Sandbox Code Playgroud)
除了输入中的空字符外,它几乎可以使用任何东西:
net*_*der 14
在你的第一个例子中,我假设你是从stdin读取的.要对第二个代码块执行相同操作,您只需删除重定向并回显$ REPLY:
DONE=false
until $DONE ;do
read || DONE=true
echo $REPLY
done
Run Code Online (Sandbox Code Playgroud)
使用grepwhile循环:
while IFS= read -r line; do
echo "$line"
done < <(grep "" file)
Run Code Online (Sandbox Code Playgroud)
使用grep .代替grep ""将跳过空行。
注意:
使用IFS=可使所有行缩进保持不变。
结尾没有换行符的文件不是标准的UNIX文本文件。
尝试使用GNU Coreutils,如tee、cat等,而不是read 。
来自标准输入
readvalue=$(tee)
echo $readvalue
Run Code Online (Sandbox Code Playgroud)
从文件
readvalue=$(cat filename)
echo $readvalue
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67610 次 |
| 最近记录: |