Como ler e analisar a entrada do usuário especificada como uma lista ou um intervalo de números

2

Qual é a maneira mais fácil de permitir que o usuário insira números nos seguintes formatos para que cada número individual possa ser impresso.

separados por vírgula (1,5,7), separados por espaço (1 5 7) e separados por intervalos (1-3,5)

Expected output if input is comma separated: 
1
5
7
Expected output if input is space separated: 
1
5
7
Expected output if input is - and , separated:
1
2
3
5

Eu tentei seguir os caminhos, definindo apenas a lógica

input_string="1,5,7"
IFS=' ' read -r -a array <<< "$input_string"
echo ${array[1]} etc..

input_string="1 5 7"
 read -r -a array <<< "$input_string"
echo ${array[1]} etc..

Quer saber como lidar - e, juntos, em array, obrigado

    
por Bharat 20.08.2018 / 11:16

3 respostas

2

Divida as vírgulas / espaços primeiro, faça um loop nos resultados e divida em traços para começar e terminar o intervalo:

$ cat ranges.sh
#!/bin/bash    
IFS=', ' read -a ranges <<< "$*"
for range in "${ranges[@]}"; do
        IFS=- read start end <<< "$range"
        [ -z "$start" ] && continue
        [ -z "$end" ] && end=$start
        for (( i=start ; i <= end ; i++ )); do
                echo "$i"
        done
done
$ bash ranges.sh 1-3,5 9-10
1       
2               
3       
5
9
10

Isso poderia fazer com melhor verificação de sanidade, etc.

    
por 20.08.2018 / 11:42
2

Tente também

T="$@"
echo {1..100} | { cut -d" " -f"${T// /,}"; }
    
por 20.08.2018 / 12:31
1

Caiu com uma Variante Awk

awk -v RS='[[:blank:]]|[\n]|[,]' '{max=a[split($0, a ,"-")]; if(max!=0){while(a[1]<=max){print a[1]++}}}' /tmp/a.txt

Lendo entrada delimitada como um registro, Dividindo-o em um array usando "-" Registros sem "-" são armazenados no primeiro índice Finalmente imprimindo valores.

Entrada:

1-3,5 6

Saída:

1
2
3
5
6
    
por 27.08.2018 / 13:31

Tags