2010-11-11 3 views
1

Я написал сценарий оболочки (называемый Trash.sh), который при запуске отобразит все файлы в моем каталоге «dustbin» и спросит пользователя, хотят ли они удалять каждый файл по одному. Сценарий выглядит следующим образом:Сценарий удаления Linux Linux

#if directory is empty, display message 
if test ! -f ~/dustbin/* 
then 
echo "Directory is empty" 
#if directory is not empty, then display each item and ask to delete 
else 
for resfile in ~/dustbin/* #for each file in directory, store it in resfile variable 
do 
    if test -f $resfile ; then #if a file exists 
    echo "Do you want to delete $resfile?" 
    echo "Enter y or n" 
    read ans #store user input in ans variable 
    if test $ans = y ; then 
    rm $resfile 
    echo "File $resfile was deleted" 
    fi 
    fi 
done 
fi 

Это прекрасно работает для меня. Когда пользователь набирает sh Trash.sh, сценарий будет работать нормально, каждый файл будет отображаться, и пользователю будет предложено его удалить или нет. Однако то, что я хотел бы добавить, - это вариант, когда пользователь может ввести sh Trash.sh -a и для всех файлов в каталоге, которые будут автоматически удалены без подтверждения.

Я немного застрял в том, как этого добиться. Есть идеи?

п.с. - Я использую Mac OS X 10.6.4 и делать все через Терминал

+0

Пожалуйста, не заменяйте оригинал w с новой версией, основанной на ответе. Это не дает никаких ответов. Предпочтительно, если это вообще необходимо, добавить исправленную версию, четко обозначенную ниже оригинала. –

+0

@Dennis - Мои извинения – 2010-11-11 16:43:36

ответ

1

Проверьте, если $1 является -a. Если это так, удалите все файлы, а затем выйдите.

2

Try:

if [ x"$1" = x"-a" ]; then 
    rm -rf ~/dustbin/*; 
    exit 0; 
fi 

в верхней части вашего сценария

+0

Вы, вероятно, имели в виду: '[x" $ 1 "=" x-a "]' –

+0

@glenn: Либо будет работать, так как кавычки будут удалены при вычислении строк. (Так что '[" x $ 1 "=" x-a "]') Это даже очевидно в части слева от знака равенства. Если вы используете эту архаичную идиому, вероятно, лучше использовать параллельную структуру ('x' вне кавычек с обеих сторон), поэтому легче увидеть, что делается. С помощью современных оболочек [пока переменная цитируется] (http://stackoverflow.com/q/3869072/26428#3870055), 'x' больше не требуется. –

+0

@dennis: Сначала я отсутствовал x с правой стороны, я отредактировал свой вопрос с – knittl

2

Я хотел бы предложить захватывая опцию -a с getopts. Затем проверьте его позже и используйте rm -f (чтобы заставить, см. Справочную страницу). Оболочка на Mac OS немного отличается от того, что я привык, но обработка опций в Баш на Linux выглядит примерно так:

force_all='f'; 
while getopts "ahv" arg 
do 
    case $arg in 
     a) force_all='t';; 
     v) echo "$SCRIPT: $VERSION"; exit;; 
     h|*) echo "$SCRIPT: $HELP"; exit;; 
    esac 
done 

Этот пример показывает, как реализовать -v для версии и -h для Помогите.

+1

Обычно я пишу 'force_all = false ... force_all = true', а затем вы можете сказать' if $ force_all; затем ... ' –

2

Первое, что нужно начать, - это научиться разбирать разбор аргументов в сценариях bash.

Короткий ответ заключается в использовании переменных $ 1, $ 2, $ N ($ 0 - имя исполняемого скрипта bash). $ * - это строка, содержащая все аргументы. Вот как вы получаете аргументы как в сценариях bash, так и в ваших собственных настройках bash. В вашем случае, простой тест, как

if [[ $1 == "-a" ]] 
then 
    #profit! 
fi 

длинного ответ заключается в использовании и узнать getopts: http://www.mkssoftware.com/docs/man1/getopts.1.asp

+0

Легко, когда вы знаете, как! Большое спасибо за помощь всем. – 2010-11-11 14:49:38

+0

он написал сценарий оболочки, а не скрипт bash (по крайней мере, он не сказал bash). '[[...]]' не будет работать в sh – knittl

+0

Предполагается, что это был bash, если он сказал, что использует Mac OSX – whaley

2

Я также хотел бы предложить использовать чистые ют для просить удаление:

rm -riv ~/dustbin/* 

И как указано в других ответах, удалите без вопросов:

rm -rfv ~/dustbin/* 
Смежные вопросы