Brian Bills
Brian Bills

Reputation: 49

Bash array value based on the host that runs it

The scripts' first for loop:

for e in "${hostnames[@]}"; do

goes through the array:

hostnames=( simpsons moes sideshow flanders )

and I want the workspace array to be conditional based on the host in the value $e

Right now I'm just using the array:

workspace_simpsons=( bart homer lisa marge releases rt-private simpsons-ws0 simpsons-ws1 simpsons-ws2 vsimpsons-ws )

in the following for loop:

for i in "${workspace_simpsons[@]}"; do

I can't figure out how to make the above for loop conditional based on the host that's in the value $e.

Please help.

today=`date +"%m-%d-%y"`
basename=/export/ws
output=/share/it-ops/Build_Farm_Reports
workspace_simpsons=( bart homer lisa marge releases rt-private simpsons-ws0 simpsons-ws1 simpsons-ws2 vsimpsons-ws )
workspace_moes=( barney carl lenny moes-ws2 )
workspace_sideshow=( bob mel sideshow-ws2 )
workspace_flanders=( flanders-ws0 flanders-ws1 flanders-ws2 maude ned rod todd to-delete )
hostnames=( simpsons moes sideshow flanders )
for e in "${hostnames[@]}"; do
if [ `hostname` == $e ] && [ ! -f $e.csv ]; then
echo ",,,,,$e" >> $e.csv
echo ",,," >> $e.csv
for i in "${workspace_simpsons[@]}"; do
echo "date_""$i"","$today >> $e.csv
echo "$i"``df -h /export/ws/$i | awk '{if (NR!=1) {print "_available"","$4}}' | sed '$s/.$//' | sed '1d'`` >> $e.csv
echo "$i"``df -h /export/ws/$i | awk '{if (NR!=1) {print "_used"","$3}}' | sed '$s/.$//' | sed '1d'`` >> $e.csv
echo ",,," >> $e.csv
done
elif [ `hostname` == $e ] && [ -f $e.csv ]; then
for b in "${workspace_simpsons[@]}"; do
num1=`df -h /export/ws/$b | awk '{if (NR!=1) {print ","$4}}' | sed '$s/.$//'i | sed '1d'`
c="$b"_available
sed -i "/^$c/ s/$/$num1/" $e.csv
num2=`df -h /export/ws/$b | awk '{if (NR!=1) {print ","$3}}' | sed '$s/.$//'i | sed '1d'`
d="$b"_used
sed -i "/^$d/ s/$/$num2/" $e.csv
v=date_"$b"
sed -i "/^$v/ s/$/,$today/" $e.csv
done
else
:
fi
done

Here's the output:

,,,,,simpsons
,,,
date_bart,09-13-14,09-13-14
bart_available,95,95
bart_used,63,95
,,,
date_homer,09-13-14,09-13-14
homer_available,100,100
homer_used,5.8,100
,,,
date_lisa,09-13-14,09-13-14
lisa_available,100,100
lisa_used,3.1,100
,,,
date_marge,09-13-14,09-13-14
marge_available,96,96
marge_used,7.0,96
,,,
date_releases,09-13-14,09-13-14
releases_available,87,87
releases_used,56,87
,,,
date_rt-private,09-13-14,09-13-14
rt-private_available,46,46
rt-private_used,1.1,46
,,,
date_simpsons-ws0,09-13-14,09-13-14
simpsons-ws0_available,99,99
simpsons-ws0_used,2.4,99
,,,
date_simpsons-ws1,09-13-14,09-13-14
simpsons-ws1_available,97,97
simpsons-ws1_used,37,97
,,,
date_simpsons-ws2,09-13-14,09-13-14
simpsons-ws2_available,18,18
simpsons-ws2_used,790,18
,,,
date_vsimpsons-ws,09-13-14,09-13-14
vsimpsons-ws_available,66,66
vsimpsons-ws_used,13,66
,,,

Upvotes: 1

Views: 316

Answers (1)

John Kugelman
John Kugelman

Reputation: 361849

You could use a case statement to set workspaces to one of four arrays.

case $e in
    simpsons) workspaces=(bart homer lisa marge releases rt-private simpsons-ws0 simpsons-ws1 simpsons-ws2 vsimpsons-ws);;
    moes)     workspaces=(barney carl lenny moes-ws2);;
    sideshow) workspaces=(bob mel sideshow-ws2);;
    flanders) workspaces=(flanders-ws0 flanders-ws1 flanders-ws2 maude ned rod todd to-delete);;
esac

Then you can get rid of all the duplicated code and use a single loop with for ws in "${workspaces[@]}". With that improvement, plus some other cleanup, I guess it would look something like this:

case $HOSTNAME in
    simpsons) workspaces=(bart homer lisa marge releases rt-private simpsons-ws0 simpsons-ws1 simpsons-ws2 vsimpsons-ws);;
    moes)     workspaces=(barney carl lenny moes-ws2);;
    sideshow) workspaces=(bob mel sideshow-ws2);;
    flanders) workspaces=(flanders-ws0 flanders-ws1 flanders-ws2 maude ned rod todd to-delete);;
esac

if ! [ -f $HOSTNAME.csv ]; then
    {
        echo ",,,,,$HOSTNAME"
        echo ",,,"

        for ws in "${workspaces[@]}"; do
            echo "date_$ws,$today"
            echo "$ws$(df -h /export/ws/$ws | awk '{if (NR!=1) {print "_available," $4}}' | sed '$s/.$//' | sed '1d')"
            echo "$ws$(df -h /export/ws/$ws | awk '{if (NR!=1) {print "_used,"      $3}}' | sed '$s/.$//' | sed '1d')"
            echo ",,,"
        done
    } > $HOSTNAME.csv
else
    for ws in "${workspaces[@]}"; do
        num1=$(df -h /export/ws/$ws | awk '{if (NR!=1) {print "," $4}}' | sed '$s/.$//i' | sed '1d')
        num2=$(df -h /export/ws/$ws | awk '{if (NR!=1) {print "," $3}}' | sed '$s/.$//i' | sed '1d')

        sed -i "/^${ws}_available/ s/$/$num1/"   $HOSTNAME.csv
        sed -i "/^${ws}_used/      s/$/$num2/"   $HOSTNAME.csv
        sed -i "/^date_${ws}/      s/$/,$today/" $HOSTNAME.csv
    done
fi

I might be mistaken, but I don't believe the outermost for e in "${hostnames[@]}" loop is even needed, so I deleted it.

Upvotes: 2

Related Questions