Search code examples
bashloopsif-statementexecawstats

Bash Loop with If Statements not Looping Properly


Quick bash script for awstats. Noting beautiful, but having an issue with loop not ocurring. Output only shows that it has performed one loop for name1, it never gets to name2, name3 with the printf's.

#!/bin/bash

awstats_command='perl /var/www/html/awstats/wwwroot/cgi-bin/awstats.pl'
html_path="/var/www/html/awstats/wwwroot"
activelogpath="/logs/web/active"
archivelogpath="/logs/web/archive"
day='date +%Y-%m-%d.%H'

# List of web servers we are processing stats for: 
for i in name1 name2 name3
do
        if [[ $i = "name1" ]]
        then
                # Custom reports for name1 contains subdirectory statistics
                printf "\nProcessing log files for $i...\n"
                /usr/bin/perl /var/www/html/awstats/wwwroot/cgi-bin/awstats.pl -config=name1 -update
                printf "done.\n"
                printf "\nGenerating .html files for $i...\n"
                /var/www/html/awstats/wwwroot/cgi-bin/do.reports $i
                $awstats_command -config=$i -output=urldetail:/about/ -staticlinks > $html_path/$i/awstats.$i.about.html
                printf "done.\n"
        else
                printf "\nProcessing log files for $i...\n"
                # Will do something when working $i
                printf "done.\n"
                printf "\nGenerating .html files for $i...\n"
                # Will do something when working $i
                printf "done.\n"
        fi

        printf "\nCompressing and archiving log files...\n"
        exec /usr/bin/gzip -cv "$activelogpath"/"$i"/*.log > "$archivelogpath"/"$i"/"$(date +%Y%m%d_%H%M%S)".gz
        # rm -f $activelogpath/$i/*.log
        printf "\nCompleted!\n"
done

Solution

  • exec /usr/bin/gzip -cv "$activelogpath"/"$i"/*.log > "$archivelogpath"/"$i"/"$(date +%Y%m%d_%H%M%S)".gz
    

    exec replaces the current process with the named program. Execution does not continue past an exec statement. There's no need for it here. Just call gzip without it.

    gzip -cv "$activelogpath/$i"/*.log > "$archivelogpath/$i/$(date +%Y%m%d_%H%M%S).gz"
    

    There's also no need to write /usr/bin/, or to leave and re-enter quotes so often.