打印 shell 变量会产生空输出

打印 shell 变量会产生空输出

我有以下程序,我想打印一个$var用程序的执行时间填充的变量。但是,当将其输出到控制台时,echoprintf该值为空。

程序:

#!/bin/bash
for n in 1 2 3 4;
    do my_time="$(time var=$(echo "scale=100; 4*a(1)" | bc -l))";
    
    echo $var
    echo $my_time       
    printf "Value of PI is :%s\n" $var
done

输出:

real    0m0.003s
user    0m0.000s
sys 0m0.000s


Value of PI is :

real    0m0.004s
user    0m0.000s
sys 0m0.000s


Value of PI is :

real    0m0.004s
user    0m0.000s
sys 0m0.000s


Value of PI is :

real    0m0.004s
user    0m0.000s
sys 0m0.000s


Value of PI is :

问题出在哪里,如何解决?

答案1

命令替换$(...)在子 shell 中运行命令。在子 shell 中设置变量不会传播到父 shell。

在这种情况下,问题就更大了,因为time内置函数不会输出到标准输出或错误。为了能够捕获其输出,您需要在子 shell 中运行它并捕获该 shell 的 stderr - 但这样,您就无法设置任何变量。

我看到的唯一可能的方法是运行命令两次,一次捕获输出,一次捕获时间:

    var=$(bc -l <<< 'scale=100; 4*a(1)')
    my_time=$( (time bc -l <<< 'scale=100; 4*a(1)') 2>&1 >/dev/null)

或者,同时捕获这两个细节并稍后将它们分开:

    out=$( (time bc -l <<< 'scale=100; 4*a(1)') 2>&1)
    var=${out%real*}
    my_time=real${out#*real}

相关内容