Bash

將逗號和冒號分隔的數字解析為 Bash 腳本中的數組值

  • December 5, 2021

我有一個用於部署服務的 Bash 腳本。它需要以附加命令行參數的形式進行更新,以指定用於啟動多個服務實例的埠。該參數接受逗號分隔的埠以及冒號分隔的埠範圍,即,一些有效值是

5001,5002,5003,5004
5001:5004
2003,4001:4008
1337,2300:2340,5000,5008

這些值需要讀入一個數組,擴大範圍(即,在2003,4001:4008values 數組的情況下應該是[2003,4001,4002,4003,4004,4005,4006,4007,4008])。

我似乎找不到僅使用 Bash 來處理所有這些情況的有效方法(不允許使用 Perl,可能是 awk)。TIA。

使用現代awk實現:

awk -v RS='[,\n]' -F: 'NF == 1; NF == 2 { for (i = $1; i <= $2; ++i) print i }'

上面的awk命令以您描述的格式讀取一行或一組行,並將每個逗號或換行符分隔的值視為“一條記錄”,並將每個以冒號分隔的字元串視為“一個欄位”。

如果記錄只有一個欄位 ( NF == 1),則按原樣列印。這是輸入中不是范圍的值之一。

如果一條記錄有兩個欄位 ( NF == 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

不對提供的參數進行驗證。

引用自:https://unix.stackexchange.com/questions/680213