Shell脚本剪切返回空字符串

时间:2016-04-20 02:35:08

标签: sh

我正在编写一个脚本,我正在尝试获取Linux发行版。我有以下代码,但它返回一个空字符串。我确信我错过了什么

OS=`cat /etc/os-release | grep -sw NAME`
NEWOS=$OS | `cut -d \" -f2`

echo $NEWOS 

3 个答案:

答案 0 :(得分:3)

你有两个问题。

  1. 仅键入$OS不会向stdout输出任何内容(通过管道传送到cut)。

  2. 您的第二个问题是您将cut放入反叛中。这意味着您正在尝试运行空切的输出。

  3. 解决方案是编写$(echo "$OS" | cut -d \" -f2)

答案 1 :(得分:2)

就像诚实的回答所说,你有两个问题。除了他的回答,我还想在你的代码中解决反引号的使用问题。

命令替换可以通过两种方式完成,一种是使用$(command),另一种是`command`。两者的工作原理相同,但$(command)形式是现代方式,具有更高的清晰度和可读性。

  

$(...)的真正优势不在于可读性(我认为这是品味问题),但嵌套命令替换的能力没有转义,并且不必担心另外必须转义$\个实例。 - mklement0

以下代码使用现代方式:

#!/bin/bash

OS=$(cat /etc/os-release | grep -sw NAME)

NEWOS=$(echo "$OS" | cut -d \" -f2)

echo $OS
echo $NEWOS

我的电脑输出:

NAME="Ubuntu"
Ubuntu

答案 2 :(得分:2)

使用替代方法补充现有的有用答案,使用单个awk命令解决问题:

os=$(awk -F\" '/^NAME=/ { print $2 }' /etc/os-release)
echo "$os"

请注意,我已将变量的大小写从OS更改为os,因为最好不要使用全大写的shell变量名称以便{ {3}}。