首先,我真的很擅长shell,你会注意到:)
现在,我有以下任务:脚本获取两个参数(fileName,N)。如果文件中的行数大于N,那么我需要剪切最后N行,然后用它覆盖文件的内容。
我想将文件的内容保存到变量中,然后将其保存到文件中。但由于某种原因,它无法正常工作。
我将最后N行保存到变量时遇到问题。
这就是我尝试这样做的方式:
lastNLines=`tail -$2 $1`
cat $lastNLines > $1
答案 0 :(得分:2)
您的lastNLines
不是文件名。 cat
获取文件名。您也无法打开输入文件进行写入,因为shell会在tail
到达之前截断它,这就是您需要使用临时文件的原因。
但是,如果你坚持不使用临时文件,这是一个不可移植的解决方案:
tail -n$2 $1 | sponge $1
您可能需要为moreutils
安装sponge
。
答案 1 :(得分:1)
cat
所采用的参数是文件名,而不是内容。
相反,您可以使用临时文件,如下所示:
tail -$2 $1 > $1._tmp
mv $1._tmp $1
要将内容保存到变量,您可以执行已包含在问题中的内容,或者:
lastNLines=`cat $1`
(当然是mv
命令之后)