Проверить ввод пользователя на "rm -i"? - PullRequest
2 голосов
/ 09 ноября 2019

Есть ли способ проверить реакцию пользователя на 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. Как?

Ответы [ 2 ]

3 голосов
/ 09 ноября 2019

Большая часть проблемы с вашей попыткой состоит в том, что вы пытаетесь разместить слишком много возможных входных данных, или, как это ни парадоксально, ограничивает входные данные определенно "да" или "нет", исключая "да", "да"," Нету "и т. д. Просто подойдет 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, что не делает.

3 голосов
/ 09 ноября 2019

Вы можете проверить, был ли файл действительно удален. Например,

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"
...