2

如何获取要解析/扩展的范围列表参数,例如“1-6,8,15-20,23,25-28,30”(到“1 2 3 4 5 6 8 15 16 17 18 19 20 23 25 26 27 28 30") 与 bash?如果 bash 不起作用,可以考虑使用其他一些普遍可用的 Linux shell。

用例:我有一个脚本需要对给定的 ID 执行某些操作,并且能够一次性处理“各种”ID 列表/范围会非常好。现在我的脚本只需要一个 ID 范围参数 AB,所以如果我的 ID 列表不是一个单一的连续范围,我需要使用不同的范围参数多次运行脚本(例如“AB,XY”变成两次运行,首先是“AB”然后是“XY”)。

list 参数的简短规范: - 一个列表是一个范围,或多个以逗号分隔的范围(也可以是其他分隔符) - 一个范围是 AB(A 小于 B),或单个数字 X(特殊情况 A=B ) - 这是数字/整数范围/列表,因此列表中可能的字符是 0-9、“-”和“,”

4

3 回答 3

2
suku@ubuntu-vm:~$ echo {1..6} 8 {15..20} 23 {25..28} 30
1 2 3 4 5 6 8 15 16 17 18 19 20 23 25 26 27 28 30

确保您在每个参数之间放置了空格。

仅供参考:这称为使用范围的大括号扩展。

我正在使用 bash 4.2.37

suku@ubuntu-vm:~$ bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

更多阅读Brace Expansion请点

编辑:

您也可以使用变量替换:

suku@ubuntu-vm:~$ A=1;F=6;H=8;eval echo {$A..$F} $H {15..20} 23 {25..28} 30
1 2 3 4 5 6 8 15 16 17 18 19 20 23 25 26 27 28 30
于 2013-01-17T12:46:42.360 回答
1

一个简单的解决方案是使用seq. 如果范围由空格分隔,则可以使用 for 循环

for range; do
    case "$range" in
    *-*) for id in $(seq $(echo $range | sed -e 's/-/ /')); do
             do_something $id
         done
         ;;
    *) do_something $range ;;
    esac
done

您可以将其称为

bash ranges.sh 1-6 8 15-20 23 25-28 30
于 2013-01-17T12:24:01.073 回答
0

这是一个bash函数,它使用参数扩展、read命令和seq命令来解析和扩展您提供的格式的字符串。

parse_range () {
    for range in ${1//,/ }; do
        IFS=- read a b <<< "$range"
        b=${b:-$a}
        seq $a $b
    done
}

for i in $(parse_range 1-6,8,15-20,23,25-28,30); do
    echo $i
done
于 2013-01-17T14:02:23.953 回答