在shell脚本中存储嵌套脚本返回值

时间:2010-12-19 21:09:46

标签: bash shell scripting

我正在尝试在ubuntu中编写一个简单的shell脚本,以dd为随机块编号 但由于某种原因,我无法完成这项简单的任务。 我试过这个食谱 http://www.shelldorado.com/newsletter/issues/2002-3-Aug.html 通过从我的调用他们的兰德脚本(删除不相关的部分)

DEV=$1
DD=dd
IF=$2

DEV_BLOCKS=4182000
BLK_SIZE=4096

# actual test
GB=$((1024*1024*1024))
for ((  i = 0 ;  i <= $(($GB * 2));  i++  ))
do
  #echo "$i times"
  offset=`./rand`    
#  offset=$(($offset%$DEV_BLOCKS))
  $DD if=$IF of=$DEV bs=$BLK_SIZE seek=$offset count=1
done

但我总是让我的$ offset变量包含一个字符串,而不是实际的invokation

$ ./rand
5732148894262698848
$ ./random
dd: opening `': No such file or directory

$ sh -x random infile outfile 2>&1 | tee log.file
+ DEV=infile
+ DD=dd
+ IF=outfile
+ DEV_BLOCKS=4182000
+ BLK_SIZE=4096
+ GB=1073741824
random: 14: Syntax error: Bad for loop variable

直接调用rand脚本会产生一个打印到控制台的完美的随机数。 有人可以帮忙指出我做错了什么吗?

如果之前有人问我,我很抱歉,我没有找到相关的帖子。 谢谢

2 个答案:

答案 0 :(得分:1)

错误消息来自dd抱怨它无法找到要打开的文件,这可能显示为空字符串。

鉴于您已在评论中指出这不是失败的代码,我们无法帮助您 - 问题不在您认为的位置,这就是为什么在{{1}中查找问题的原因没有帮助。

最有可能的是,您的命令行有一些变体,例如:

rand

并且您实际上在命令行中有dd if=$filel of=$file2 bs=4096 seek=$offset 的{​​{1}}错字。例如:

l

如果缺少输出文件,则会收到相同的消息。你应该立即调试:

1

当然,您也可以添加诊断打印,例如:

$ dd if= of=/dev/null bs=23 count=2
dd: opening `': No such file or directory
$ 

(或者,既然你可能从来没有受过那些在“sh -x yourscript ”符号中出现错误的shell的折磨,你实际上可以放弃echo rand=$offset 1>&2 因为经验不好而反复地放在那里在运行DOS / Windows shell模拟器的机器上过去几年。)

答案 1 :(得分:0)

您使用的rand脚本需要一个数字参数。结果数字将介于0和N-1之间。我怀疑你没有得到一个号码,因为你没有提供这个参数。

另一种可能性是如果脚本无法执行。您确定它是正确的目录并且该文件是可执行的吗?也许在测试时尝试使用完整路径以确保。

注意:我认为你想在DD上使用count=1,因为听起来你想复制一个块。如果不这样做,它将继续写入块,直到到达输入文件的末尾。