如果我运行这个命令:
awk -F'[="]+' '/^(NAME|VERSION)=/{printf("%-17s: %s\n",$1,$2)}' /etc/os-release
从终端,我可以检索:
NAME : Debian GNU/Linux
VERSION : 8 (jessie)
(注意格式/间距)。但是,当我尝试将此命令分配给局部变量并调用它时,正如我在此函数中所做的那样:
#!/bin/bash
#### Display header message ####
# $1 - message
function write_header(){
local h="$@"
echo "------------------------------"
echo " ${h}"
echo "------------------------------"
}
#### Get info about Operating System ####
function os_info(){
local namevers=$(awk -F'[="]+' '/^(NAME|VERSION)=/{printf("%-17s: %s\n",$1,$2)}' /etc/os-release)
write_header "System Info"
echo "Operating System : $(uname --kernel-name)"
echo "Kernel Version : $(uname --kernel-release)"
echo $namevers
}
os_info
我的格式被破坏了(请参阅 NAME 之后的输出):
------------------------------
System Info
------------------------------
Operating System : Linux
Kernel Version : 3.16.0-4-amd64
NAME : Debian GNU/Linux VERSION : 8 (jessie)
我可以通过删除局部变量并在单独的行上调用 awk 来解决格式错误,如下所示:
awk -F'[="]+' '/^(NAME)=/{printf("%-17s: %s\n",$1,$2)}' /etc/os-release
awk -F'[="]+' '/^(VERSION)=/{printf("%-17s: %s\n",$1,$2)}' /etc/os-release
但这看起来有点笨重,并且不符合我正在编写的较大脚本的结构。对于如何解决这个问题,有任何的建议吗?
请注意:我无法使用,LSB module
因为我正在测试此脚本的某些机器没有安装该软件包。此外,事情需要在没有提升权限的情况下运行。
答案1
啊,我在脚本中看到了问题:
变量在这里被分割:
echo $namevers
要修复它,请执行以下操作:
printf '%s\n' "$namevers"
这是输出:
------------------------------
System Info
------------------------------
Operating System : Linux
Kernel Version : 3.16.0-4-amd64
NAME : Debian GNU/Linux
VERSION : 8 (jessie)
答案2
如果我理解正确,这应该会产生您想要的输出:
function os_info(){
write_header "System Info"
echo "Operating System : $(uname --kernel-name)"
echo "Kernel Version : $(uname --kernel-release)"
awk -F'[="]+' '/^(NAME|VERSION)=/{printf("%-17s: %s\n",$1,$2)}' /etc/os-release
}
如果您确实想使用变量,则需要引用它以保留格式:
echo "${namevers}"
答案3
虽然这个答案可能无法直接回答您有关awk
功夫的问题,但您也可以source
立即/etc/os-release
使用变量。
function os_info() {
. /etc/os-release
write_header "System Info"
echo "Operating System : $(uname --kernel-name)"
echo "Kernel Version : $(uname --kernel-release)"
echo "NAME : $NAME"
echo "VERSION : $VERSION"
}