我正在编写一个脚本,我正在尝试获取Linux发行版。我有以下代码,但它返回一个空字符串。我确信我错过了什么
OS=`cat /etc/os-release | grep -sw NAME`
NEWOS=$OS | `cut -d \" -f2`
echo $NEWOS
答案 0 :(得分:3)
你有两个问题。
仅键入$OS
不会向stdout输出任何内容(通过管道传送到cut
)。
您的第二个问题是您将cut
放入反叛中。这意味着您正在尝试运行空切的输出。
解决方案是编写$(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}}。