如何在没有tail命令的情况下编写尾部脚本

t0m*_*myt 3 unix bash

你会如何在bash中实现这一目标.这是我在面试中被问到的一个问题,我可以用高级语言来思考答案,但不能用shell来思考答案.

据我了解,tail的真正实现寻求到文件的末尾,然后向后读.

cni*_*tar 9

主要思想是保持固定大小的缓冲区并记住最后一行.这是使用shell做尾部的快速方法:

#!/bin/bash

SIZE=5
idx=0

while read line
do
    arr[$idx]=$line
    idx=$(( ( idx + 1 ) % SIZE )) 
done < text

for ((i=0; i<SIZE; i++))
do
    echo ${arr[$idx]}
    idx=$(( ( idx + 1 ) % SIZE )) 
done
Run Code Online (Sandbox Code Playgroud)

  • 在数学上下文中不需要`$`; `for((i = 0; i <idx; i ++))`不需要`$ idx`.另外,`idx = $((idx + 1))`在POSIX sh中有效,并且比使用expr更容易阅读; 同样对于`idx = $(((idx + 1)%SIZE))`. (2认同)

sjn*_*arv 7

如果允许所有not-tail命令,为什么不是异想天开?

#!/bin/sh

[ -r "$1" ] && exec < "$1"

tac | head | tac
Run Code Online (Sandbox Code Playgroud)

  • `exit $?`是多余的 - shell的默认退出状态是最近运行的命令. (4认同)