Bash
將逗號和冒號分隔的數字解析為 Bash 腳本中的數組值
我有一個用於部署服務的 Bash 腳本。它需要以附加命令行參數的形式進行更新,以指定用於啟動多個服務實例的埠。該參數接受逗號分隔的埠以及冒號分隔的埠範圍,即,一些有效值是
5001,5002,5003,5004 5001:5004 2003,4001:4008 1337,2300:2340,5000,5008
這些值需要讀入一個數組,擴大範圍(即,在
2003,4001:4008
values 數組的情況下應該是[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
不對提供的參數進行驗證。