--- a/utils/aa-decode
+++ b/utils/aa-decode
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 #
 #    Copyright (C) 2009-2010, 2012 Canonical Ltd.
 #    Copyright (C) 2012 Christian Boltz
@@ -16,8 +16,6 @@
 #    along with this program; if not, contact Canonical, Ltd.
 #
 
-set -e
-
 help() {
     cat <<EOM
 USAGE: aa-decode [OPTIONS] <encoded string>
@@ -36,13 +34,15 @@ $ cat /var/log/kern.log | aa-decode
 EOM
 }
 
-decode() {
-    if echo "$1" | egrep -q "^[0-9A-Fa-f]+$" ; then
-      python3 -c "import binascii; print(bytes.decode(binascii.unhexlify('$1'), errors='strict'));"
-    else
-      echo ""
-    fi
+match_re() {
+	local result=$(echo "$1" | grep -E "$2" )
+	[ -z "$result" ] && return 1 || return 0
+}
 
+
+decode() {
+	$(echo "$1" | egrep -q "^[0-9A-Fa-f]+$"); [ "$?" -eq 0 ] &&
+		python3 -c "import binascii; print(bytes.decode(binascii.unhexlify('$1'), errors='strict'));" || echo ""
 }
 
 if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
@@ -51,47 +51,61 @@ if [ "$1" = "-h" ] || [ "$1" = "--help"
 fi
 
 # if have an argument, then use it, otherwise process stdin
-if [ -n "$1" ]; then
-    e="$1"
-    if ! echo "$e" | egrep -q "^[0-9A-Fa-f]+$" ; then
-        echo "String should only contain hex characters (0-9, a-f, A-F)"
-        exit 1
-    fi
-
-    d=`decode $e`
-    if [ -z "$d" ]; then
-        echo "Could not decode string"
-        exit 1
-    fi
+[ -n "$1" ] && {
 
-    echo "Decoded: $d"
-    exit 0
-fi
+	e="$1"
 
-# For now just look at 'name=...' and 'profile=...',
-# so validate input against this and output based on it.
-# TODO: better handle other cases too
-while read line ; do
+	$(echo "$e" | egrep -q "^[0-9A-Fa-f]+$"); [ "$?" -ne 0 ] && {
+		echo "String should only contain hex characters (0-9, a-f, A-F)"
+		exit 1
+	}
 
-    # check if line contains encoded name= or profile=
-    if [[ "$line" =~ \ (name|profile|proctitle)=[0-9a-fA-F] ]]; then
+	d=$(decode $e)
 
-        # cut the encoded filename/profile name out of the line and decode it
-        ne=`echo "$line" | sed 's/.* name=\([^ ]*\).*$/\\1/g'`
-        nd="$(decode ${ne/\'/\\\'})"
+	[ -z "$d" ] && {
+		echo "Could not decode string"
+		exit 1
+	}
 
-        pe=`echo "$line" | sed 's/.* profile=\([^ ]*\).*$/\\1/g'`
-        pd="$(decode ${pe/\'/\\\'})"
+	echo "Decoded: $d"
+	exit 0
+}
 
-        pce=`echo "$line" | sed 's/.* proctitle=\([^ ]*\).*$/\\1/g'`
-        pcd="$(decode ${pce/\'/\\\'})"
+[ -t 0 ] && {
+	help
+	exit
+}
+
+while read line ; do
 
-        # replace encoded name and profile with its decoded counterparts (only if it was encoded)
-        test -n "$nd" && line="${line/name=$ne/name=\"$nd\"}"
-        test -n "$pd" && line="${line/profile=$pe/profile=\"$pd\"}"
-        test -n "$pcd" && line="${line/proctitle=$pce/proctitle=\"$pcd\"}"
+	# check if line contains encoded name= or profile=
 
-    fi
+	matches=0
+	match_re "$line" "^[[:blank:]](name|profile|proctitle)=[0-9a-fA-F]+"; [ "$?" -eq 0 ] && matches=1 || {
+		 match_re "$line" "^(name|profile|proctitle)=[0-9a-fA-F]+"; [ "$?" -eq 0 ] && matches=1
+	}
+
+	[ "$matches" -eq 0 ] || {
+
+		# cut the encoded filename/profile name out of the line and decode it
+		ne=$(echo "$line" | sed 's/.* name=\([^ ]*\).*$/\\1/g')
+		[ "$line" = "$ne" ] && ne=$(echo "$line" | sed 's/.*name=\([^ ]*\).*$/\\1/g')
+		echo var: $ne
+		nd="$(decode ${ne/\'/\\\'})"
+
+		pe=$(echo "$line" | sed 's/.* profile=\([^ ]*\).*$/\\1/g')
+		[ "$line" = "$pe" ] && pe=$(echo "$line" | sed 's/.*profile=\([^ ]*\).*$/\\1/g')
+		pd="$(decode ${pe/\'/\\\'})"
+
+		pce=$(echo "$line" | sed 's/.* proctitle=\([^ ]*\).*$/\\1/g')
+		[ "$line" = "$pce" ] && pce=$(echo "$line" | sed 's/.*proctitle=\([^ ]*\).*$/\\1/g')
+		pcd="$(decode ${pce/\'/\\\'})"
+
+		# replace encoded name and profile with its decoded counterparts (only if it was encoded)
+		test -n "$nd" && line="${line/name=$ne/name=\"$nd\"}"
+		test -n "$pd" && line="${line/profile=$pe/profile=\"$pd\"}"
+		test -n "$pcd" && line="${line/proctitle=$pce/proctitle=\"$pcd\"}"
+	}
 
     echo "$line"
 
