Bash

如何將變數及其值輸出到文件中

  • May 11, 2020

我在這個任務上有點掙扎,例如我可以做一個簡單的循環來將變數值發送到帶有 for 循環的文件中。但是如何在輸出變數值之前得到一些東西呢?我做了這樣的事情作為解決方法:

list="$1\n$2\n$3"
varNames=$'var1=\nvar2=\nvar3='


for i in $varNames $list; do
   echo -e $varNames$list > "vars-$(date +%Y-%m-%d_%H.%M).file"
done

但是我無法正確地循環遍歷兩個列表中的每個項目,但是我得到的輸出是:

var1= var2= var3=$1
$2
$3

如上 $ 1, $ 2,$3 是我之前創建的變數的正確值。我在這個循環中缺少什麼?這是創建兩個列表的好方法,還是可以由一些 sed 之後處理?

謝謝!

幾乎與腳本中的行一樣多的問題,我嘗試一個一個地完成,在每一步都假設其他一切都按預期工作。

list="$1\n$2\n$3"

這不起作用,因為\n不會被換行符替換,你需要這樣的東西:

list="$1"$'\n'"$2"$'\n'"$3"

或者

list="$1
$2
$3"
for i in $varNames $list; do

假設您修復了 (1),則此循環將執行 6 次(免責聲明,請參見本文的最後一句)。每個$varNamesand一次$list,我認為這不是有意的。此外,當你像這樣循環時,變數不會被換行符分割,而是被$IFS. 它預設為換行符、空格或製表符。所以它可以工作,但知道這一點,你也可以list="$1 $2 $3"在 (1) 中使用。當然,這只有在您知道這些變數中的每一個都不包含任何換行符、空格或製表符的情況下才有效。

echo -e $varNames$list

輸出整個變數,而不僅僅是$i.

您為每次迭代覆蓋整個文件。更好的使用

for ...; do ... done > file

所以現在怎麼辦?

我認為你不能輕易地修復你的程式碼。相反,您應該使用 bash 數組並遍歷鍵:

#!/bin/bash

list=("$1" "$2" "$3")
varNames=("var1" "var2" "var3")

for k in "${!varNames[@]}"; do
   printf '%s=%s\n' "${varNames[$k]}" "${list[$k]}"
done > "vars-$(date +%Y-%m-%d_%H.%M).file"

我更喜歡使用printf見這個echo),但如果你不在乎,你也可以像這樣使用……

echo "${varNames[$k]}=${list[$k]}"

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