サービスを展開するためのBashスクリプトがあります。サービスの複数のインスタンスを起動するために使用されるポートを指定するには、追加のコマンドラインパラメータ形式で更新する必要があります。このパラメーターは、カンマ区切りポートとコロン区切りポートの範囲を受け入れます。つまり、一部の有効な値は次のとおりです。
5001,5002,5003,5004
5001:5004
2003,4001:4008
1337,2300:2340,5000,5008
値を配列として読み取って範囲を拡張する必要があります(つまり、2003,4001:4008
値配列の場合と同じでなければなりません[2003,4001,4002,4003,4004,4005,4006,4007,4008]
)。
Bashだけを使用してこれらすべての状況を処理する効率的な方法が見つからないようです(Perlでは許可されていませんが、awkでは許可されています)。ティア。
ベストアンサー1
最新のawk
実装を使用してください。
awk -v RS='[,\n]' -F: 'NF == 1; NF == 2 { for (i = $1; i <= $2; ++i) print i }'
上記のコマンドawk
は、説明した形式で1行または行セットを読み取り、各コンマまたは改行で区切られた値を「レコード」として処理し、各コロンで区切られた文字列を「フィールド」として扱います。
レコードにフィールドが1つしかない場合(NF == 1
)、そのまま印刷します。入力に含まれる範囲以外の値の1つ。
レコードに2つのフィールド(NF == 2
)がある場合は、最初のフィールドから2番目のフィールドまでの数字を印刷します。
テスト:
$ echo '2003,4001:4008' | awk -v RS='[,\n]' -F: 'NF == 1; NF == 2 { for (i = $1; i <= $2; ++i) print i }'
2003
4001
4002
4003
4004
4005
4006
4007
4008
その後、生成されたリストを任意の方法で使用できます。例えば、
#!/bin/sh
printf '%s\n' "$1" |
awk -v RS='[,\n]' -F: 'NF == 1; NF == 2 { for (i = $1; i <= $2; ++i) print i }' |
xargs -I {} some_executable ...options... --port={}
some_executable ...options... --port={}
これはコードの各数値出力に対して一度実行され、数値に置き換えられますawk
。{}
このawk
コードは、スクリプトの最初の引数として指定された文字列を取得します。
提供されたパラメーターについては検証は行われません。