2016-01-22 169 views
0

我想在bash forloop中讀取文件。但我不知道如何把這個腳本寫出來。Bash在for循環中讀取多個文件(作爲執行論據)

for i in $(seq 0 $step 10) 
do 
    echo "Rendering: "$((i + j)) 
    python auto_fine.py density000000.vtu velocity000000.vtu $((i + j)) 
done 

每個循環我需要調用

I - > 0蟒auto_fine.py density000000.vtu velocity000000.vtu

我 - > 1個蟒auto_fine.py density000010.vtu velocity000010。 VTU

我 - > 2蟒蛇auto_fine.py density000020.vtu velocity000020.vtu

回答

1

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]},其中xy是 任一整數或單個字符,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擴展,並且不被命令替換($(..))解釋。

+0

好的。但請注意,OP可能需要'seq',因爲它允許您指定步驟,甚至更重要的是使用變量。 – fedorqui

+0

@fedorqui - 謝謝。在第一個例子中,我們通過跳過不以0結尾的數字來排序10。第二個例子中,由於printf格式字符串,我們隱含地加10。第三,我們使用乘數在序列表達式上創建* real *增量。 – ghoti

+0

@fedorqui - 當然,我意識到只有在寫完這個答案之後,我纔在OSX中進行測試。 '{x..y..incr}'符號是用bash 4引入的,並且很好地處理了序列。 – ghoti

-1

循環在當前目錄中的所有文件很簡單:

for i in $(ls -1) 
do 
    # your code here, variable is referenced with $i 
done 

什麼是您正在使用的變量j

2

在我看來,你需要填零的數字sed提供給你:

How to zero pad a sequence of integers in bash so that all have the same width?看到的,你需要做這樣的事情

$ seq -f "%06g" 0 10 100 

將返回:

000000 
000010 
000020 
... 
000100 

All together,

for i in $(seq -f "%06g" 0 10 100) 
do 
    # echo "Rendering: "$((i + j)) -- not sure what this does 
    python auto_fine.py density$i.vtu velocity$i.vtu 
done 
+0

'/ usr/bin/seq'是一個外部二進制文件,但'printf'是一個內置的。爲什麼不使用'printf'? – ghoti

+0

@ghoti你的意思是'爲我在printf「%06g」{1..10}''?這聽起來像一個非常好的主意。 – fedorqui

+0

我得到像這樣的錯誤:[bash:000008:值太大的基地(錯誤標記是「000008」)] – Mathi