2012-05-11 65 views
0

我在Linux上創建了一個簡單的bash腳本來創建隨機文件。我通過文件名和文件大小的腳本是這樣的:Bash腳本+移動多個變量

./createFiles 5 filename1 filename2 

* 5 =文件大小

我的代碼如下所示:如預期

#! /bin/bash 

oriDir=files/ori 
fileSize=$1 
fileName=$2 


# Create files 
for fileName do 

    dd if=/dev/urandom of=$oriDir/$2.mp4 bs=1048576 count=$fileSize 

    # Shift through filenames 
    shift 1 

done 

輸出。我的目錄中有2個新文件:

filename1.mp4 (size 5) 
filename2.mp4 (size 5) 

我現在要做的是使用各種文件大小的foreach文件名。我的命令就不是這個樣子:

./createFiles 5 2 filename1 filename2 

該腳本將不是生成兩個文件:

filename1.mp4 (size 5) 
filename2.mp4 (size 2) 

可選,腳本應該能夠做到以下幾點:萬一有不止名給出的filesizes,它應該只取最後文件大小爲所有剩餘的文件名:

./createFiles 5 2 filename1 filename2 filename3 

會產生:

filename1.mp4 (size 5) 
filename2.mp4 (size 2) 
filename3.mp4 (size 2) 

我的確嘗試過使用shift並添加另一個shit命令,但沒有任何工作。

+0

你所的方式選擇構造參數 ... ...不適合簡單的shell編程。嘗試使用 ......改爲。 – Phil

+0

感謝您的建議!馬上試試@ Tiago的回答。 – Andrej

+0

你原來的劇本很奇怪。將循環移出循環會更典型,並執行:fileSize = $ 1;轉移; for fileName; do dd if =/dev/urandom of = $ oriDir/$ fileName.mp4 bs = 1048576 count = $ fileSize;完成 –

回答

3

,如果你選擇這樣的事情

./script文件1尺寸1文件2 size2個... fileN的SIZEn

您可以通過此列表迭代成對

limit=$[ $#/2 ]; 
for((i=0;i<$limit;i++)){ 
file=$1 
size=$2 

# do some stuff 
shift 2 
} 
+0

不要以爲我以前的評論在這裏!我知道了;) – Andrej

+0

刪除了。 (B) –

+0

中的(()){}構造不再需要,只需要最後一件事:說我有5個文件,其中4個文件應該具有相同的大小。我是否必須爲每個文件添加filsize,比如'file1 size1 file2 size2 ...',或者是否有一種簡單的方法來告訴腳本'將size1用於file1;從file2到file5使用size2'?那只是可選的,如果它變得太複雜我寧願不這樣做。 – Andrej