【问题标题】:Bash bad substitution with subshell用 subshel​​l 替换错误
【发布时间】:2017-01-18 00:38:32
【问题描述】:

我正在尝试获取不带引号的发行版名称。

cat /etc/*-release | grep "NAME=.*" -o | cut -d "=" -f2 | head -n1

返回: "CentOS Linux"

现在,使用 shell 替换,我尝试删除引号,将命令放在子 shell 中:

echo ${$(cat /etc/*-release | grep "NAME=.*" -o | cut -d "=" -f2 | head -n1)/\"}

我想我可以使用 \" 转义引号,然后省略最后一个 / 以简单地删除引号。

编辑: 我知道这可以通过awk 完成,但我不知道如何。

编辑: cat /etc/*-release的输出:

CentOS Linux release 7.2.1511 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.2.1511 (Core)
CentOS Linux release 7.2.1511 (Core)

预期输出:CentOS Linux

【问题讨论】:

  • @Inian 没有示例文件,这些是/etc/ 下的文件。至少在 Debian 和 CentOS 上

标签: bash parameter-expansion


【解决方案1】:

/etc/os-release 似乎是一组简单的 shell 赋值语句;您可能简单地获取它并输出$NAME 的值(使用子shell 以避免潜在地覆盖当前shell 中的任何变量):

( . /etc/os-release; echo "$NAME" )

这可能存在安全风险,具体取决于您对/etc/os-release 可能出于任何原因包含其他可执行代码的信任程度。

根据您的实际需要,您也可以简单地使用/etc/centos-release,其中包含您想要的信息作为一个简单的字符串。 (当然,您可能不会假设您的脚本将在 CentOS 机器上运行。os-release 似乎是一个更与发行版无关的版本。)

【讨论】:

  • 如果文件可能发生变化,您甚至可以说(. $(grep -l "^NAME=" /etc/*ease); echo "$NAME"),以便您获取包含^NAME= 的文件。
【解决方案2】:

使用awk,获取NAME 变量后面的操作系统名称。

awk -F"=" '$1=="NAME"{gsub(/"/, "", $2);print $2; exit}' /etc/os-release 
CentOS Linux

【讨论】:

    【解决方案3】:

    您的解决方案几乎可行。 "CentOS Linux" 中的引号是发布文件的一部分,使用子外壳没有帮助。您可以使用带有双引号的cut 作为分隔符:

    cat /etc/*-release | grep "NAME=.*" -o | cut -d "=" -f2 | head -n1 | cut -d '"' -f2
    

    您可以使用sed 来做同样的事情

    sed -n '/^NAME=/ {s/NAME="\(.*\)".*/\1/p;q}' /etc/*-release 
    

    解释:告诉sed只打印带有p的行,查找以NAME=开头的行,匹配引号之间的部分并在第一行之后退出NAME=

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多