choroba explicou muito bem que seu problema é com o script de shell usando-se como intérprete em vez de bash
.
Aqui está uma sugestão para a reimplementação do seu script que
-
Não contém erros de sintaxe ( dirFocus = ""
é, por exemplo, um erro de sintaxe em que =
não deve ter espaços ao redor em uma atribuição).
-
Lida com nomes de arquivos que possuem espaços e novas linhas (o loop na saída de ls
desqualifica qualquer nome de arquivo, da mesma forma wc -w
teria a contagem errada se algum nome de arquivo contivesse espaços).
-
Usa sintaxe moderna de shell ( $[ $i + 1 ]
é obsoleta bash
sintaxe).
-
Apresenta melhorias minúsculas na saída (adiciona (dir)
aos nomes dos diretórios).
#!/bin/bash
shopt -s dotglob # make wildcards match hidden names by default
shopt -s nullglob # make wildcards expand to nothing if no match
count=0
for name in "${1:-.}"/*; do
count=$(( count + 1 ))
if [ -d "$name" ]; then
printf '%d : %s (dir)\n' "$count" "${name##*/}"
else
printf '%d : %s\n' "$count" "${name##*/}"
fi
done
Isso também não expande a lista de arquivos mais de uma vez, enquanto seu código faz um ls
em todo o diretório para cada nome no diretório.
${1:-.}
significa "use o que está em $1
, a menos que esteja vazio ou não definido, caso contrário use .
".
${name##*/}
significa "a string em $name
, mas sem o bit até o último /
".