[英]Storing output into variable bash
我試圖將gawk
的結果附加到相應的文件,並使用for
循環到目錄基線中的所有文件:
#! /bin/sh
for file in baselines/*; do numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }') echo "Number of Threads: $numThreads" >> $file; done
但是numThreads
變量沒有分配給任何東西,因此它將“Number of Threads:”附加到文件中。
文件夾基線包含is.A.2.baseline
, is.A.4.baseline
和is.A.8.baseline
等文件,所以我希望附加“線程數:2”,“線程數: 4“和”線程數:8“分別......
你的問題是缺少換行符(或者,在extremis中,分號)。 你的腳本是:
for file in baselines/*; do numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }') echo "Number of Threads: $numThreads" >> $file; done
在echo "Number of Threads..."
部分之前,您需要換行符或分號。 像這樣可讀性:
for file in baselines/*
do
numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }')
echo "Number of Threads: $numThreads" >> $file
done
如果您堅持編寫不可讀的代碼,請這樣:
for file in baselines/*; do numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }'); echo "Number of Threads: $numThreads" >> $file; done
但請不要再將這樣的代碼發送到Stack Overflow進行審核/修訂,因為它很難閱讀,人們也不會費心去回答難以閱讀代碼的問題。
順便說一句,你的代碼所做的是非常巧妙的錯誤。 它運行echo
命令,並將環境變量numThreads
設置為正確的值, 但參數列表的擴展在此之前發生,因此numThreads
為空,因為評估了"Number of Threads: $numThreads"
字符串。 證明這一點的一種方法是:
for file in baselines/*
do
numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }') env | grep numThreads
done
這將打印環境變量的值。 證明它的另一種方式是:
for file in baselines/*
do
numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }') sh -c 'echo numThreads=$numThreads'
done
在單獨的語句中執行變量賦值和echo:
for file in baselines/*; do
numThreads=$(echo $file | gawk 'BEGIN { FS = "." } ; {print $3 }')
echo "Number of Threads: $numThreads" >> $file
done
變量擴展在執行任何操作之前發生,因此當您將它們放在一行上時,變量會在分配之前展開。 只有當您臨時設置將在子進程中訪問的環境變量時才應使用該語法,而不是在為當前進程設置shell變量時使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.