/ / Bash:a-b、C、k、m-n、x-y、z-bash、list、rangeのような範囲リスト

Bash:a-b、C、k、m-n、x-y、z-bash、list、rangeのような範囲リスト

次のような範囲リストパラメータを取得するには"1〜6,8,15〜20,23,25〜28,30"をbashで解析/展開( "1 2 3 4 5 6 8 15 16 17 18 19 20 23 25 26 27 28 30")する? bashが動作しない場合は、一般的に利用可能な他のLinuxシェルも考えられます。

使用事例: 私は与えられたIDで何かをする必要のあるスクリプトを持っていて、 "すべての種類の" IDリスト/範囲を一度に処理することができればいいです。私のスクリプトはID範囲パラメータが1つしかないので、私のIDリストが1つの範囲外の範囲でない場合は、異なる範囲のパラメータで複数回スクリプトを実行する必要があります(たとえば、 "AB、XY"次に「XY」)。

listパラメータの短い指定: - リストは1つの範囲、またはカンマで区切られた複数の範囲です(他のセパレータも可能です) - 範囲はA-B(Bより小さいA)または単一の数X(特殊な場合A = B)です。 これは数値/整数の範囲/リストなので、リスト内の可能な文字は0-9、 " - "、 "、"

回答:

回答№1は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

回答№2については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

回答№3の場合は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