我想写一个 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 后才会写入文件。
祝你好运。