Bash

列印 shell 變數會產生空輸出

  • September 7, 2021

我有以下程序,我想在其中列印一個變數$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 :

問題出在哪裡,如何解決?

命令替換$(...)在子 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}

引用自:https://unix.stackexchange.com/questions/667663