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 シェルを検討できます。

ユースケース: 特定の ID で何かを行う必要があるスクリプトがあり、「すべての種類の」ID リスト/範囲を一度に処理できれば (それ以上に) 便利です。現在、私のスクリプトは 1 つの ID 範囲パラメーター AB のみを使用するため、ID リストが 1 つの連続した範囲ではない場合、異なる範囲パラメーターを使用してスクリプトを数回実行する必要があります (たとえば、"AB,XY" は 2 回の実行になり、最初に "AB" が実行されます)。次に「XY」)。

list パラメーターの短い仕様: - リストは 1 つの範囲、またはカンマで区切られた複数の範囲 (他の区切り記号も可能) - 範囲は AB (B より小さい A)、または単一の数値 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 に答える