bash 脚本删除历史记录中的最后 10 行

bash 脚本删除历史记录中的最后 10 行

我想写一个 bash 脚本来删除历史记录中的最后 10 行,我就是这样做的,但我仍然收到错误

#!/bin/bash
i= history | wc -1
j= $i-10
for x in {$i..$j}
do
  history -d $x
done

我不知道哪里出了问题,有什么想法吗?

答案1

有几个错误。

i= 历史 | wc -1

这里有空格,所以你需要用“”括起来以避免错误,此外,你在等号后面添加了一个不必要的空格。但是,你所做的只是创建一个包含“history | wc -1”的变量。首先,没有“wc -1”。我认为你的意思是“wc -l”,它计算行数。其次,我认为你想真正运行这个命令。

您可以使用:

i=$(历史 | wc -l)

但是,结果始终是 0,因为您处于子 shell 中。

j=$i-10 复制代码

您在等号后添加了一个空格。您可以使用“j=$i-10”,但这实际上不会进行任何数学运算。

尝试以下方法:

j=$(echo "${i}-10" | bc -l)

您可能需要编写一个 if 语句来处理 i 为 10 或更小的情况。

尝试以下方法:

如果 [[ "$i" -lt "11" ]]; 那么 j="1"; fi
对于 x 在 {$i..$j}

您不能在这里使用变量。结果将是 #..#,而不是数字列表。您可以通过创建一行 for do done 语句来解决此问题,该语句会回显到变量中,然后使用 eval 实际执行它。这样,当运行命令时,$i 和 $j 就已经被替换为实际数字。

最终尽管,整个方法都是毫无意义的,因为当您在 shell 脚本中运行 history 命令时,您将得到零作为计数结果,因为您处于子 shell 中,而子 shell 不会报告其历史记录。要了解我的意思,请运行几个命令,然后运行此脚本:

/bin/bash #!/bin/bash
历史 | wc -l

可以看到,结果为 0。为什么呢?因为这是子 shell 的历史记录,而子 shell 不会报告历史记录。即使在脚本中在 history 命令之前添加了其他命令,结果也会为 0。

重新开始。直接查看编辑历史文件正如@kos 所建议的。请记住,当前 shell 中的命令直到退出 shell 后才会写入文件。

祝你好运。

相关内容