Bash可以做到這一點,而不需要像seq
這樣的外部工具。
for i in {0..100}; do
[[ $i = *0 ]] || continue
python auto_fine.py density$(printf '%06d' $i).vtu velocity$(printf '%06d' $i).vtu
done
這將使用模式匹配(*0
)到您的列表限制爲每10號,這是一個黑客位,但將努力對您的樣本數據。
,你可以對直接在零填充數字字符串交替循環:
for i in $(printf '%05d0 ' {0..10}); do
python auto_fine.py density$i.vtu velocity$i.vtu
done
此選項顯示每10個項目由增加數量,成爲十位數字後加一個零在printf
格式。如果你想要更多的任意排序,您可以使用乘法器,仍然沒有產卵外部進程:
low=0
high=100
mult=10
for i in $(eval echo {$low..$((high/mult))}); do
n=$(printf '%06d' $((i*mult)))
python auto_fine.py density$n.vtu velocity$n.vtu
done
注意eval
,它可以讓你擴大變量在序列表達式中使用。 (如果您從外部獲取這些數字,請在使用它們之前驗證它們)
如果您使用bash版本4(即不是OSX上的本機版本),還可以使用增量序列表達式。從手冊頁:
序列表達式的形式爲{x..y[..incr]}
,其中x
和y
是 任一整數或單個字符,incr
,可選的增量, 是整數。
因此,也許:
low=0
high=100
mult=10
for i in $(eval "printf '%06d ' {$low..$high..$mult}"); do
python auto_fine.py density$i.vtu velocity$i.vtu
done
注意,在表達式序列,該序列的第一成員是提供,而不是僅僅一個乘法器的乘積的第一個號碼。我們在printf周圍引用了引號,以確保序列表達式被eval擴展,並且不被命令替換($(..)
)解釋。
好的。但請注意,OP可能需要'seq',因爲它允許您指定步驟,甚至更重要的是使用變量。 – fedorqui
@fedorqui - 謝謝。在第一個例子中,我們通過跳過不以0結尾的數字來排序10。第二個例子中,由於printf格式字符串,我們隱含地加10。第三,我們使用乘數在序列表達式上創建* real *增量。 – ghoti
@fedorqui - 當然,我意識到只有在寫完這個答案之後,我纔在OSX中進行測試。 '{x..y..incr}'符號是用bash 4引入的,並且很好地處理了序列。 – ghoti