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