是否可以检查用户对rm -i
执行的响应?
我想根据用户是否回复echo
或y
来n
。
无论用户的响应如何,命令都会成功返回,因此此尝试无效:
$ 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
。
怎么样?
答案 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)
尝试中的大多数问题是您试图容纳太多可能的输入,或者自相矛盾地将输入限制为限制为“是”或“否”,而排除了“是”,“是的”,“不”等。只需使用y
或n
即可(实际上,您唯一需要区分的是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
本身提供的一些挂钩,而不会。