problemas trabalhando em um script com $ # e um loop

0

eu tenho o seguinte script:

    #!/bin/bash
    for ((i=1; i<=$#; i++));
    do
       if [ ! -d $i ]
       then
          echo $i its not a directory >> file.txt
       else
          DIRECTORY=$(ls -l $i | grep ^d | wc -l)
          LINK=$(find $i -type l | wc -l)
          FILE=$(ls -A $i | wc -l)

          echo 'date "+%H:%M:%S %d-%m-%y"' directory $i file count: $FILE link count: $LINK subdirectory count: $DIRECTORY >> file.txt

       fi
    done

este script conta os subdiretórios, links e arquivos de um diretório inserido por parâmetro (pode ser maior que 1).

eu estou lutando com o loop, ele retorna "echo $ i não é um diretório" lendo $ i como 1 em vez de $ 1, eu entendo por que ele faz isso, mas eu estou começando com scripts e não sei como conserte isto. Eu acho que um "while" pode ser um substituto para aquele "for" mas não sei como usá-lo corretamente.

obrigado pela ajuda!

    
por Kuma 26.05.2016 / 21:14

2 respostas

1

Você está dando um loop de 1 a [number of arguments] e, em seguida, testando se cada um desses números é, de fato, um diretório. Pode ser mais simples fazer algo como:

#!/bin/bash
for item in "$@"; do  # iterate over the arguments themselves
    if [[ ! -d "$item" ]]; then
        echo "$item is not a directory" >> file.txt
    else
        DIRECTORY=$(ls -l $item | grep ^d | wc -l)
        LINK=$(find $item -type l | wc -l)
        FILE=$(ls -A $item | wc -l)

        echo 'date "+%H:%M:%S %d-%m-%y"' directory $item file count: $FILE link count: $LINK subdirectory count: $DIRECTORY >> file.txt
    fi
done
    
por 26.05.2016 / 21:32
1

O que você está tentando fazer é chamado de indireto de variável - você quer se referir à variável cujo nome é armazenado dentro de outra variável. Isso é possível em bash - basta se referir a "${!i}" em vez de $i .

Observe também a importância das aspas duplas em torno de suas variáveis .

Dito isto ... você pode simplificar seu script drasticamente. Por exemplo, aqui é um verso que faz quase tudo o que você está tentando fazer com o seu script.

    
por 26.05.2016 / 21:38