【问题标题】:How to use counter in for loop as input in bash file如何在for循环中使用计数器作为bash文件中的输入
【发布时间】:2019-10-26 04:22:45
【问题描述】:

我想多次运行 c 代码。在 c 代码中,变量 (n) 从命令行读取一个值。我想写一个 bash 文件来为我做这件事。但我不知道如何在 bash 文件的循环中读取值。 bash 文件是这样的:

#!/bin/bash

EXE=exc3_1
RES=$EXE.d
for i in 2 4 8 16
do  
  COMMAND="mpirun -n $i $EXE >> $RES"
  echo $COMMAND
  eval $COMMAND 
done

gnuplot << EOF
set datafile separator " "
set xlabel "Num of procs"
set ylabel "time of operation"
set title "weak scaling of trapezoidal rule"
plot $RES
EOF

在命令eval $COMMAND 之后,我应该读取n 的值。

“已编辑” 并且值 n 应该用于 c 代码中的输入参数,如下所示:

scanf("%d", &N);

我的意思是在 bash 文件的每次迭代中,N 应该从命令行读取并用作

scanf("%d", &N);

在 c 代码中。

【问题讨论】:

    标签: bash for-loop input


    【解决方案1】:

    要使用命令行输入作为文件的输入,可以使用管道| 运算符,例如

    read n
    echo $n | eval $COMMAND
    

    所以 bash 文件应该修改如下:

    #!/bin/bash
    
    EXE=exc3_1
    RES=$EXE.d
    for i in 2 4 8 16
    do  
      COMMAND="mpirun -n $i $EXE >> $RES"
       echo $COMMAND
       read n
       echo $n | eval $COMMAND 
    done
    
    gnuplot << EOF
    set datafile separator " "
    set xlabel "Num of procs"
    set ylabel "time of operation"
    set title "weak scaling of trapezoidal rule"
    plot $RES
    EOF
    

    【讨论】:

      【解决方案2】:

      为了从外部命令中读取某些内容,可以采用两种方式: 1:直接读取命令的输出;和 2:将命令的输出重定向到某个众所周知的地方,然后从那里读取。

      COMMAND="mpirun -n $i $EXE >> $RES"
      回声 $COMMAND

      您似乎想从“mpirun”读取一些输出,并且您选择了重定向它的输出。在您的代码中,mpirun 的输出将被写入(警告:附加)到名为exc3_1.d 的文件中。可能您想发出类似的问题:

      COMMAND="mpirun .... > ..."
      eval $COMMAND              # execute the command
      read yourvar < exc3_1.d    # read from where mpirun wrote to
      

      但是,我认为与其重定向 mpirun 的输出,不如直接从中读取:

      yourvar=$($COMMAND)
      

      上述行执行括号中指定的内容,获取输出,并存储在名为“yourvar”的变量中。

      [评论后编辑] 我认为更好的选择是如上所示运行您的命令,特别是如果您使用多任务处理。但我不知道你用 mpirun 做什么...... 我这么说是因为有很多方法,但它们都应对“标准输出”,这是您在继续之前应该了解的机制。

      对于第二部分,将传递它的内容部署到 C 程序,这是另一回事 - 这个网站上的另一个问题可能会有所帮助。同样,有两种方法,通过 scanf():

      echo $myvalue | $mycommand   # pass to standard input
      

      ($mycommand 启动的程序通过 scanf() 读取),或者:

      eval "$mycommand $myvalue"
      

      (适合将myvalue作为参数传递)。 希望对您有所帮助。

      【讨论】:

      • 感谢您的回答。我添加了更多细节以使问题更清楚。正如我添加的那样,我希望 bash 文件的每次迭代中的代码读取参数的值,并将其用作 c 代码中 scanf("%d", &amp;N); 的输入。
      • @Pejvak 我更新了我的答案,但你应该尝试一下。
      猜你喜欢
      • 2015-11-16
      • 2013-03-19
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      相关资源
      最近更新 更多