Você pode substituir o valor de $i in para ver o comando exato que está tentando executar:
app4/ | sed -e "s/^.*\(.\)$//"
Isso não funciona porque app4/ não é um comando. Você está tentando canalizar app4/ para sed , então você precisa usar algo que produza app4/ :
echo app4/ | sed -e "s/^.*\(.\)$//"
Isso funciona, mas você não precisa usar sed para isso; bash tem algumas ferramentas de manipulação de strings. Por exemplo, ${i#} fornecerá o comprimento de $i e ${i:j} fornecerá uma substring a partir de j , por isso ${i:$((${i#}-1))} fornecerá o último caractere.
A maneira mais fácil de fazer o que você está tentando é provavelmente com ${i%/} . Isso retornará $i , mas removerá um / do final, se houver um:
$ i="app4"; echo ${i%/}
app4
$ i="app4/"; echo ${i%/}
app4
Assim:
if [ "${i%/}" = "$i" ]
then
echo "file"
else
echo "folder"
fi
No entanto, se tudo que você realmente quer é saber se $i é um diretório válido, você pode simplesmente usar:
if [ -d "$i" ]