Seu código funciona bem para mim, mas há alguns erros que falharão em alguns casos (por exemplo, se um nome de arquivo tiver um espaço).
- Em primeiro lugar, não analise ls . Em vez disso, iterar usando um glob. ou seja, em vez de
$(ls)
, use*
. - Ao ler variáveis, você deve citá-las, ou seja, usar
"$foo"
em vez de$foo
. Se você não os citar, o shell dividirá a saída no IFS (ou seja, os espaços). Você pode testar isso com seu script. Inclua alguns diretórios sem espaços e teste com um espaço. Apenas o primeiro será contado.
Aqui está o código fixo:
#!/bin/bash
n=0
for afile in *
do
if [ -d "$afile" ]
then
(( n ++ ))
fi
done
echo There are $n directories under the current directory $(pwd).
exit 0
Não tenho certeza se isso é óbvio, mas o script será executado no diretório atual.