Cycle for with for-then-else

Hi,

i would like to insert a if-then-else function in to cycle for

--------------
cat test
--------------

[root@EmcSanServer ~]# cat test
ALFA
BETA
GAMMA

-----------------------

This is my script:

#!/bin/bash

for i in $(cat test); if [ $i = 'ALFA' ]; then
        echo "ok"
else
        echo "not ok"
fi
done

That's is wrong?

there is a do statement missing.

--
The preferred construct for this kind of application would be:

while read i
do 
  if [ $i = 'ALFA' ]; then
    echo "ok"
  else
    echo "not ok"
  fi
done < test

Sorry, but can i insert in to this cycle a command like this?

#!/bin/bash

SID=xx
symcfg list -sid $SID -pool -gb -det -thin |grep pool |awk '{print $1}' >list_vmax_xx_pools

while read i
do
if [ `symcfg show -sid $SID -pool $i -detail -thin -gb |grep "Max. Subscription Percent"` = 'Enable' ]; then
    echo "ok"
  else
    echo "not ok"
  fi
done < list_vmax_xx_pools

cat list_vmax_xx_pools

pool_1
pool_2
pool_3

symcfg show -sid $SID -pool $i -detail -thin -gb |grep "Max. Subscription Percent"
will return some line which include string Max. Subscription Percent and also Enable in same line ?
Have you tested the command and what is the output in this lines where is Max. Subscription Percent ?

If syntax is

if commandline
then
       # commandline exit code is 0 = ok
       echo ok
else # commandline exit code <> 0
       echo not ok
fi

[ is one of the commands. So it's also [[.
But also symcfg, cp, grep, awk, .. are commands.

Ex. testing how cp works

if cp file file2  >/dev/null 2>&1
then
      echo "cp done"
else
      echo "cp not so ok"
fi

So something: grep output to the /dev/null - not so interesting to see.

if symcfg show ... | grep  ...  >/dev/null 2>&1
then
    ...
fi

But you can also test output of grep.

data=$(symcfg show -sid $SID -pool $i -detail -thin -gb | grep "Max. Subscription Percent" )

# grep some value and if some line include also Enable then okay.
case "$data" in
        *Enable* ) echo "ok" ;;
        *) echo "not ok" ;;
esac

But if line include "Max. Subscription Percent" and "Enable" in this order, then why not using grep something like

grep "Max. Subscription Percent.*Enable"
# 
data=$(symcfg show -sid $SID -pool $i -detail -thin -gb | grep "Max. Subscription Percent.*Enable" 2>/dev/null)
[ "$data" = "" ] && echo "not ok"
[ "$data" != "" ] && echo "ok"

You of course can, there's no syntax error, but the way you present it won't yield a reasonable result. symcfg may output whatever it wants, if you grep for "Max Subscription Percent" the output will never be an "Enable" alone.
Why don't you grep for "pool.*Max Subscription Percent" or even "pool.*Max Subscription Percent.*Enable" (as proposed by kshji) in the first place and then work on the results file? Or, maybe, that's already what you desired?
BTW, kshji's last data evaluation could be condensed to

[ -z "$data" ] && echo "not ok" || echo "OK"

For me this is the best:

data=$(symcfg list -v |grep "Symmetrix Data Encryption"|head -n 1|awk '{print $5}' )

# grep some value and if some line include also Enable then okay.
case "$data" in
        *Enable* ) echo "ok" ;;
        *) echo "This is not ok" > /tmp/mailmessage2
        mutt -s "SCRIPT TEST" my.address@domain < /tmp/mailmessage2 ;;
esac

Thanks, for this help :slight_smile: