我正在尝试将变量写入文本文件中的特定位置。
到目前为止,我已经完成了变量生成部分,但是当我打开文本文件查看结果时,${at}
占位符已替换为${assetTag}
而不是变量的值。 / p>
set -x # Print each line of script
set -e # Print error codes for debugging
serialNum=$(dmidecode -s chassis-asset-tag)
assetTag=$(awk -e '$1 == "'"$serialNum"'"{print $2; q}' /tmp/AssetTag.txt)
cat /tmp/BIOS.txt | sed -e "s/{$aT}/$assetTag/" >> /tmp/BIOS.txt
exit 0
因此,我的想法是将$serialNum
与包含序列号和资产标签的文件进行比较。从那里,我将相应的资产标签写入$assetTag
。之后,我需要将文本文件中的$aT
占位符替换为$assetTag
值,并保存文件以上传到系统中。
BIOS.txt excerpt
... <br>
Asset Tracking Number <br>
${aT} <br>
Ownership Tag <br>
Product Name <br>
Thin Client <br>
...<br>
BIOS.txt excerpt after running script
... <br>
Asset Tracking Number <br>
${assetTag} <br>
Ownership Tag <br>
Product Name <br>
Thin Client <br>
...<br>
编辑:
我尝试编辑文件的部分原因是我使用的脚本引擎最多包含4096个字符。过去我做过“ cat> /tmp/Rename.txt << EOL”,然后简单地在脚本引擎中写出了整个文件。但是,这使我处于极限,因此我没有更多的空间来添加代码。因此,如果我可以编辑复制到瘦客户端的现有文件...,则可以在脚本中保存实际代码行,而不用于文件构建。
编辑:
好的,所以我在Asset_Tag.txt文件中的资产标签的末尾找到了回车符。从而导致当前的头痛。
assetTag=$(awk -e '$1 == "'"$serialNum"'"{print $2; q}' /tmp/AssetTag.txt)
sed -e "s/@aT@/$assetTag/" /tmp/T630_BIOS.txt > /tmp/BIOS.txt
所以问题是我是否需要在某个地方放置tr -d '\r'
。在assetTag声明中?
答案 0 :(得分:0)
这是危险的操作:
cat file | cmd >> file
它将同时打开文件进行读取和修改。如果操作系统没有阻止您,那将是一个无休止的循环(猫正在读取内容,将cmd添加到文件中,使用cmd读取新输入...)。
我建议您将输出写入新文件,以避免各种奇怪的问题。
也就是说,模式{$aT}
将永远与输入${aT}
不匹配。为了匹配输入,您需要以下正则表达式:\${aT}
,但是您使用的是双引号,因此BASH可能会在sed
看到反斜杠之前就使用反斜杠。检查set -x
提供的调试输出。确保反斜杠仍然存在。如果不起作用,请尝试使用\\${aT}
或单引号-但单引号会影响$assetTag
的扩展,因此您将需要使用与{{ 1}}脚本。
这就是为什么许多基于BASH的模板引擎使用不同的前缀,如awk
而不是@
的原因:$
(无花括号)或@aT@
或者这可能更简单:
@{aT}
即而不是复杂的cat header.tmpl > /tmp/BIOS.txt
echo "$assetTag" >> /tmp/BIOS.txt
cat footer.tmpl >> /tmp/BIOS.txt
脚本,只需从片段构建输出即可。
答案 1 :(得分:0)
这似乎是解决方法。卸下回车符后,文件将正确附加,BIOS更新程序将正常运行。感谢亚伦·迪古拉(Aaron Digulla)为我指出正确的方向!
serialNum=$(dmidecode -s chassis-asset-tag)
aTag=$(awk -e '$1 == "'"$serialNum"'"{printf $2; q}' /tmp/AssetTag.txt)
assetTag=$(echo $aTag | tr -d '\r' )
sed -e "s/@aT@/$assetTag/" /tmp/BIOS.txt > /tmp/BIOS_new.txt