Substituir:
if ["$#" == "0"]
com:
if [ "$#" = "0" ]
Alguns comentários:
-
No shell, os espaços são importantes. Se você quiser que o shell reconheça o comando de teste,
[, deve haver espaços ao redor do[.Os espaços não são importantes para as palavras-chave do shell, mas
[, diferente de[[, é um comando, não uma palavra-chave. -
O significado da mensagem de erro
[0: command not foundé que"$#"foi avaliado como 0, de modo que a string["$#"se tornou[0e bash não encontrou nenhum comando com o nome[0. -
É possível usar
==para igualdade de string no bash. Não é, no entanto, portátil. No POSIX, o operador de igualdade correto em[...]é=. Isso se torna muito importante se você executar o script, seja intencionalmente ou involuntariamente , sob um shell POSIX comodash.
Outras questões
-
Mais uma vez, os espaços são importantes. Quando o shell vê este comando:
output = "$($0 $x)"ele tentará executar um comando chamado
outpute fornecerá dois argumentos, sendo o primeiro=e o segundo o"$($0 $x)". Consequentemente, como Gordon Davisson aponta, essa linha deve ser substituído por:output="$($0 $x)"Como não há espaços em torno do
=, o shell tratará isso como uma atribuição de variável. -
O script tenta analisar a saída de
lse isso não é confiável . Nesse caso, isso resultará em erros se algum dos nomes dos subdiretórios contiver espaço em branco. -
Como o rici aponta, o comando
directory="$(echo pwd)"provavelmente não faz o que você espera. Observe:$ directory="$(echo pwd)" $ echo "$directory" pwdEsse comando atribui a string
pwdà variáveldirectory. Provavelmente, você quer o diretório de trabalho atual, assim:directory=$(pwd)Mas é mais simples que isso. No Unix, o diretório de trabalho atual é sempre
.:directory=. -
Existem outras razões pelas quais essa declaração if-then não faz o que se espera:
if ["$#" == "0"] directory="$(echo pwd)" then directory=$1 fiVocê provavelmente deseja mover a instrução
thene adicionar uma instruçãoelse:if [ "$#" = "0" ] then directory=. else directory="$1" fi
Script alternativo
Se o objetivo for contar o número de arquivos regulares em um diretório e todos os seus subdiretórios, tente:
echo "$(find "$directory" -type f -printf "1\n" | wc -l)"
Essa abordagem é segura de usar, mesmo que os nomes de arquivos ou diretórios contenham espaços em branco ou outros caracteres difíceis.