基本上,我在 bash 中有一堆命令向我的机器询问它的信息。
喜欢:
> host=$(hostname -A)
hostname=$(hostname -I)
Pub_IP=$(dig +short
myip.opendns.com @resolver1.opendns.com)
Kernel_Version=$(uname -v | awk -F"Debian" '{print $2}' | cut -d ' ' -f2 | cut -d '-' -f1)
Deb_Version=$(cat /etc/debian_version)
我也附和一下
echo $host $hostname $Pub_IP $Kernel_Version $Deb_Version > info.txt
我需要弄清楚如何|
在每个参数之间放置。所以如果我查看我的 info.txt 文件,它看起来像
| debianmachine | output_of_hostname | output_of_Pub_IP |
另外,我可以通过打印来做到这一点吗?
答案1
如果您引用或转义字符串,则可以包含管道:
echo "| ${host} | ${hostname} ..."
您当然printf
也可以使用(我认为这就是您在问题末尾所问的问题):
printf '| %s | %s | %s ...' "${host}" "${hostname}" "${Pub_IP}" ...
您可以利用 的printf
重复行为来简化格式字符串:
printf '| %s ' "${host}" "${hostname}" "${Pub_IP}" ...; printf '|\n'
这将| %s
根据需要多次重复该序列,并以管道符和回车符结束该行。
答案2
使用printf
:
printf '| %s | %s | %s | %s | %s |\n' "$host" "$hostname" "$Pub_IP" "$Kernel_Version" "$Deb_Version" >info.txt
%s
格式字符串中的(printf
的第一个参数) 是字符串占位符,其中每个占位符都将被依次printf
给出的其他参数替换。printf
答案3
一种想法可能是将所有变量存储在一个数组中,并在循环中根据所需的修改将它们打印出来。
不过,我认为 shell 的字符串连接更有效、更简单,例如:
echo "| $host | $hostname | $Pub_IP | $Kernel_Version | $Deb_Version |" > info.txt
另一种方法是使用简单的 awk 循环来按程序创建文件的内容,例如:
awk '{print "|"\
for (i=1 ; i <= NF ; i++) \
print " ", $i, " |"}' \
info.txt | xargs -11 > info.txt