Como converter um parâmetro de entrada para um valor inteiro em um loop for no bash? [duplicado]

1

no meu script bash eu tento usar um número como uma variável de entrada for a para loop Eu corro o script como

./script.sh InputFolder/ Number_of_iterations

o script deve funcionar dentro da pasta especificada e executar um loop for quantas vezes a variável Number_of_iterations estiver definida. Mas de alguma forma eu não posso definir a variável como um inteiro.

este é um exemplo do meu loop no script:

for i in {1..$(($2))}
do
 echo "Welcome $i times"
done

Já experimentei a opção $(($...)) de colchetes duplos, bem como as duplas citações "..." , mas a saída que recebo é

Welcome {1..5} times

o que me faz pensar, isso não é um inteiro. Eu gostaria de receber ajuda para ler o parâmetro de entrada como um inteiro no script.

    
por Assa Yeroslaviz 22.01.2018 / 10:51

2 respostas

3

Você pode fazer isso de duas maneiras:

Com shells compatíveis com ksh93 (ksh93, zsh, bash):

for (( i=1;i=<$2;i++ ))
do
 echo "Welcome $i times"
done

Aqui, definimos i para 1 e loop, incrementando até que seja menor ou igual a $ 2

Com shells POSIX nos sistemas GNU:

for i in $(seq "$2")
do
 echo "Welcome $i times"
done

O comando seq (específico do GNU) produzirá números de 1 para o número especificado em $ 2 em linhas separadas. Supondo que você não tenha modificado $IFS (que por padrão contém o caractere delimitador de linha), a substituição de comando dividirá isso em quantos elementos para for executarem.

    
por 22.01.2018 / 11:22
1

No Bash essa construção que você está tentando usar: {1..$(($2))} ou {1..$2} é a expansão de chave. A razão pela qual isso não funciona para você é que na ordem de expansões de shell a expansão de chave é a primeira. Portanto, quando essa expansão ocorrer, $2 ainda será apenas $2 , não 5 , conforme desejado. A expansão de chave não funciona então. Ele simplesmente produz 1..$2 e, quando chegar a hora de expandir $2 , o shell faz isso, e você fica com esta palavra:

{1..5}

As chaves ainda estão lá porque não foram consumidas pela expansão da chave.

Quanto a soluções, consulte a resposta de Raman Sailopal .

    
por 22.01.2018 / 11:27