O principal problema é que você está lendo $line e, em seguida, usando $i . Além disso, echo "bad" não está no bloco else , mas no normal. Então, será sempre impresso.
Você também pode precisar usar eval :
while read line
do
eval "$line"
if [ $? -eq 0 ]; then
echo "good"
else
echo "bad"
fi
done < file1.txt
Observe também que é importante citar as variáveis como em eval "$line" .