检查用户在“ rm -i”上的输入?

时间:2019-11-09 16:56:59

标签: bash rm

是否可以检查用户对rm -i执行的响应? 我想根据用户是否回复echoyn

无论用户的响应如何,命令都会成功返回,因此此尝试无效:

$ rm -i testfile.txt && echo "The file was deleted."
remove testfile.txt? n
The file was deleted.

我的理由是,echo部分仅在rm部分成功的情况下才会执行,但是显然n响应也算作成功执行。

我还希望能够根据答案来更改消息。这段代码可以做到,但不是很漂亮。

file=testfile.txt
touch $file

read -p "Are you sure (y/n)? " answer
if [[ $answer =~ ^[yY](es|ES)?$ ]]; then
    rm $file
    echo "Deleted file."
else
    echo "Did nothing."
fi

肯定有一种方法可以将输入传递到rm -i。 怎么样?

2 个答案:

答案 0 :(得分:3)

您可以检查文件是否被实际删除。例如

rm -i testfile.txt && [[ ! -e testfile.txt ]] && echo "The file was deleted."

如果rm成功,则测试文件是否不存在[[ ! -e file ]],然后仅显示消息。它涵盖了这种情况,当您尝试删除不存在的文件时,此后rm将返回退出代码,而不是0。

如果要显示有关文件被有意删除或未删除的消息,以及有关错误的其他信息,则可以像这样扩展先前的代码:

rm -i testfile.txt && {
    [[ ! -e testfile.txt ]] && echo "The file was deleted." || echo "Ignored"
} || echo "Error"

答案 1 :(得分:3)

尝试中的大多数问题是您试图容纳太多可能的输入,或者自相矛盾地将输入限制为限制为“是”或“否”,而排除了“是”,“是的”,“不”等。只需使用yn即可(实际上,您唯一需要区分的是y与非-y之间)。

read -p "Are you sure (y/n)? " answer
if [[ $answer = [yY]* ]]; then
    rm -- "$file"
    echo "Deleted file."
else
    echo "Did nothing."
fi

如果愿意,可以在shopt -s nocasematch语句之前使用if,以便您只需编写if [[ $answer = y* ]]; then即可忽略用户实际输入的大小写。

您最初的问题将需要rm本身提供的一些挂钩,而不会。