UNIX Как удалить ненужные / лишние строки в моем выводе? - PullRequest
0 голосов
/ 22 мая 2019

Мой скрипт подражает команде rm, короче говоря.Кто-нибудь может указать на ошибки / ненужные строки, которые есть в моем скрипте удаления, которые приводят к тому, что мой вывод выдает чрезмерные / не относящиеся к делу строки?Код работает как задумано, но выдает все эти ненужные / чрезмерные / дублирующие строки.Вывод ниже - это то, что выглядит, когда я пытаюсь удалить 2 файла в одной строке и выполнить некоторые другие простые команды.Заранее спасибо.Я ценю любую помощь.

вход: sh remove file2 file4 выход:

Executed
Executed
cannot remove file4: no such file or directory
stat: cannot stat 'file4': No such file or directory
mv: cannot stat 'file4': No such file or directory
Executed
mv: cannot stat 'file4': No such file or directory
File moved to recycle bin
#/bin/bash

function directory(){
if [ ! -d ~/deleted ]    
then    
         mkdir ~/deleted    
fi   
if [ ! -f ~/.restore.info ]
    then    
        touch ~/.restore.info    
fi    
}    

function movefile(){    
mv $1 ~/deleted/$1    
echo "file moved to recycle bin"    
}    

function error_conditions(){
#prints error messages and checks if file is in project directory   
if [ ! -f ~/project ]   
    then   
        echo "cannot remove $filename: no such file or directory"   
elif [ -d ~/project ]   
        then   
             echo "cannot remove $filename: is a directory"  
else  
    echo "missing operand"  
fi  
}   

function delete_file(){    
#gets inode for filename    
inode=$(stat -c%i $filename)    
filename=$1   
#pwd=$(readlink -e$filename)    
if $interactive   
    then    
        if [ $verbose = true ]; then   
            read -p "Are you sure you want to delete $filename?" i_input   
                  if [ $i_input == "y" ] || [ $i_input == "Y" ]    
                        then    
                     mv $filename ~/delete/${filename}_inode    
                     echo ${filename}_$inode:$pwd>>~/.restore.info    
                    echo "$filename has been deleted"    
                         else    
                        echo "Nothing has been deleted"    
                     fi   
             else    
                read -p "Are you sure you want to delete $filename?" i_input    
                if [ $i_input == "y" ] || [ $i_input == "Y" ];    
                     then    
                     mv $filename ~/deleted/${filename}_$inode    
                     echo ${filename}_$inode:$pwd>>~/.restore.info    
                         else    
                         echo Aborted   
                 fi    
             fi    
         elif $verbose    
             then    
                 mv $filename ~/deleted/${filename}_inode    
                 echo ${filename}_$inode:$inode:pwd>>~/.restore.info    
                 echo "$filename has been deleted."    
         else    
             mv $filename ~/deleted/${filename}_$inode    
             echo ${filename}_$inode:$pwd>>~/.restore.info    
             echo Executed    
     fi    
     }    
     interactive=false    
     verbose=false    
    while getopts iv option    
     do    
       case $option in    
             i) interactive=true;;    
             v) verbose=true;;    
         esac    
     done   
    shift $[OPTIND-1]    
     for i in $*    
         do    
     filename=$i    
     baseline=$(basename $i)    
     if [ "$i" == "" ];    
         then    
            echo "No filename provided"    
        elif [ -d $filename ];    
             then    
                 if [ ! $recursive = true ];    
                     then    
                         echo "Directory name provided, please provide a file"    
                 fi   
         elif [ ! -f $filename ];   
             then    
                echo "File does not exist"    
       elif [ "$basefule" == "safe_rm" ]    
            then    
                echo "Attempting to delete safe_rm"    
       else    
            delete_file $filename    
         fi    
         done    

     #################################M A I N###############################   
    directory   
    error_conditions $*   
    delete_file $*   
    movefile $*

1 Ответ

1 голос
/ 22 мая 2019
  • Пожалуйста, сделайте отступ правильно.
  • for i in $* должно быть for i in "$@" или просто for i.
  • Как правило, переменные должны быть в кавычках (например, "$1", "$i", "$filename", "$verbose" и т. Д.)
  • <b>$[</b><i>expression</i><b>]</b> устарел. Используйте <b>$((</b><i>expression</i><b>))</b>.
  • Ваш основной цикл звонит

    delete_file $filename
    
    * * 1 022 (линия 100). Ваша delete_file функция устанавливает
    filename=$1
    

    (строка 35), что несколько избыточно и поэтому сбивает с толку.

  • Вы установили baseline, но никогда не используете его. Вы тестируете (т. Е. Ссылка) $basefule, даже не устанавливая его. Должны ли они быть одной и той же переменной?
  • Код говорит

    if [ ! -f ~/project ]
    then
        echo "cannot remove $filename: no such file or directory"
         ︙
    

    Это очень вводящее в заблуждение сообщение.

  • У вас есть большой комментарий, который говорит «M A I N», но «основной» код начинается примерно на 33 строки раньше.
  • Код делает
    for i in $*
        do
    filename=$i                             # This is an example of terrible indenting.
         ︙
             delete_file $filename
                  ︙
         done
    , но затем, пятью строками позже,
    delete_file $*
    так что вы обрабатываете файлы дважды. Таким образом, даже если delete_file удастся при первом вызове, файл пропадет при повторном вызове.
  • И, если вы хотите вызвать функцию (например, delete_file) со всеми аргументами к сценарию, Вы должны использовать "$@" вместо $*.
  • И, , если вы собираетесь звонить delete_file со списком имен файлов, тогда delete_file необходимо выполнить итерации по этим аргументам. Ваша delete_file функция смотрит только на $1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...