cmd || echo "something" - doesn't exit uppon error

Hi guys,

I have a shell script where I have the following:

for i in ad0 ad1
do
  gpart create -s gpt $i || echo "Cannot create GPT partition on "$i". Exiting ..."
  gpart add -s 128 -t freebsd-boot $i || echo "Cannot add freebsd-boot partition on "$i". Exiting ..."
  gpart add -s 4G -t freebsd-swap -l swap $i || echo "Cannot add freebsd-swap partition to "$i". Exiting ..."
  gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 $i || echo "Cannot add bootcode to "$i". Exiting ..."
done

The problem is that, upon an error, the "if not" doesn't exit. Does it have something to do with the "for" loop ?

You didn't ask it to exit so it is not exiting...

cmd || (echo "Not good" && exit 1)

HTH
--ahamed

This should do what you want:

for i in ad0 ad1; do

  gpart create -s gpt "$i" || {
    printf >&2 'Cannot create GPT partition on "%s". Exiting ...\n' "$i"
    exit 1
    }
  
  gpart add -s 128 -t freebsd-boot "$i" || {
    printf >&2 'Cannot add freebsd-boot partition on "%s". Exiting ...\n' "$i"
    exit 1
    }
    
  gpart add -s 4G -t freebsd-swap -l swap "$i" || {
    printf >&2 'Cannot add freebsd-swap partition to "%s". Exiting ...\n'
    exit 1
    }
    
  gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 "$i" || {
    printf >&2 'Cannot add bootcode to "%s". Exiting ...\n' "$i"
    exit 1
    }
    
done

Something like this would be even better:

die() {
  [ -n "$1" ] &&
    printf >&2 '%s\n' "$1"
  exit 1
  }

for i in ad0 ad1; do

  gpart create -s gpt "$i" || 
    die "Cannot create GPT partition on $i. Exiting ..." 
  
  gpart add -s 128 -t freebsd-boot "$i" || 
    die "Cannot add freebsd-boot partition on $i. Exiting ..."
    
  gpart add -s 4G -t freebsd-swap -l swap "$i" || 
    die "Cannot add freebsd-swap partition to $i. Exiting ..."

  gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 "$i" || 
    die "Cannot add bootcode to "%s". Exiting ..."
    
done

You may need to hide the errors in a logfile, given that you want to handle the exceptions:

_errlog=${0##*/}_error.log

die() {
  [ -n "$1" ] &&
    printf >&2 '%s\n' "$1"
  exit 1
  }

for i in ad0 ad1; do

  gpart create -s gpt "$i" 2> "$_errlog" || 
    die "Cannot create GPT partition on $i. Exiting ..." 
  
  gpart add -s 128 -t freebsd-boot "$i" 2> "$_errlog" || 
    die "Cannot add freebsd-boot partition on $i. Exiting ..."
    
  gpart add -s 4G -t freebsd-swap -l swap "$i" 2> "$_errlog" || 
    die "Cannot add freebsd-swap partition to $i. Exiting ..."

  gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 "$i" 2> "$_errlog" || 
    die "Cannot add bootcode to "%s". Exiting ..."
    
done