如何将变量及其值输出到文件

如何将变量及其值输出到文件

我在这个任务上有点挣扎,例如我可以做一个简单的循环来使用 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 处理?

谢谢你!

答案1

脚本中的问题几乎与脚本中的行一样多,我尝试一一进行检查,在每一步中都假设其他一切都按预期工作。

1.

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

这是行不通的,因为\n不会被换行符替换,你需要这样的东西:

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

或者

list="$1
$2
$3"

2.

for i in $varNames $list; do

假设您修复了 (1),该循环将运行 6 次(免责声明,请参阅最后一句)。$varNames和各一次$list,我认为这不是有意的。另外,当你像这样循环时,变量不会被换行符分割,而是被$IFS。默认为换行符、空格或制表符。所以它是有效的,但知道这一点后,您也可以只list="$1 $2 $3"在 (1) 中使用。当然,只有当您知道这些变量中的每一个都不包含任何换行符、空格或制表符时,这才有效。

3.

echo -e $varNames$list

输出整个变量,而不仅仅是 的分割部分$i

4.

每次迭代都会覆盖整个文件。更好的利用

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]}"

相关内容