2012-05-11 66 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