如何读取和解析指定为列表或数字范围的用户输入

如何读取和解析指定为列表或数字范围的用户输入

允许用户以以下格式输入数字以便可以打印每个单独的数字的最简单方法是什么。

逗号分隔 ( 1,5,7 ),空格分隔 ( 1 5 7 ) 和范围分隔 ( 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

我尝试过以下方法,仅定义逻辑

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..

想知道如何处理 - 和 ,两者一起在数组中,谢谢

答案1

首先按逗号/空格分割,循环结果,然后按破折号分割以获得范围的开始和结束:

$ 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

这可以通过更好的健全性检查等来实现。

答案2

也试试

T="$@"
echo {1..100} | { cut -d" " -f"${T// /,}"; }

答案3

想出了一个 awk 变体

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

将分隔输入读取为记录,使用“-”将其拆分为数组没有“-”的记录存储在第一个索引上最后打印值。

输入:

1-3,5 6

输出:

1
2
3
5
6

相关内容