Linux 将命令的输出分配给变量(BASH)

Linux 将命令的输出分配给变量(BASH),linux,bash,shell,command,Linux,Bash,Shell,Command,我需要将命令的输出分配给变量。我尝试的命令是: grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}' 我尝试使用以下代码分配变量: UUID=$(grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}') 但是,它给出了一个语法错误。此外,我希望它在bash脚本中工作 错误是: ./upload.sh: line 12:

我需要将命令的输出分配给变量。我尝试的命令是:

grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}'
我尝试使用以下代码分配变量:

UUID=$(grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}')
但是,它给出了一个语法错误。此外,我希望它在bash脚本中工作

错误是:

./upload.sh: line 12: syntax error near unexpected token ENE=$( grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}'
 )'

./upload.sh: line 12:   ENE=$( grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}'
 )'

为了解决问题,以及其他一些事情,看看你是否能让它工作,你也可以尝试使用“backticks”,例如

pwd
命令的输出保存在变量cur_dir中,但通常最好使用
$()
方法

从以下给我的页面开始:

第二种形式
`COMMAND`
(使用backticks)对于Bash来说或多或少是过时的,因为它 嵌套有一些问题(“内部”回跳需要转义) 和转义字符。使用
$(命令)
,它也是POSIX

使用“$()”子shell操作符是获取bash命令输出的常用方法。由于它跨越了一个子层,所以效率不高

我试过:

UUID=$(grep UUID /etc/fstab|awk '/ext4/ {print $1}'|awk '{print substr($0,6)}')
echo $UUID # writes e577b87e-2fec-893b-c237-6a14aeb5b390
它工作得很好:)

编辑:

当然,您可以缩短您的命令:

# First step : Only one awk
UUID=$(grep UUID /etc/fstab|awk '/ext4/ {print substr($1,6)}')
再一次:

# Second step : awk has a powerful regular expression engine ^^
UUID=$(cat /etc/fstab|awk '/UUID.*ext4/ {print substr($1,6)}')
您还可以将awk与文件参数一起使用::

# Third step : awk use fstab directlty
UUID=$(awk '/UUID.*ext4/ {print substr($1,6)}' /etc/fstab)

确切的错误是什么,您确定使用的是
bash
?看起来不错。这(可能)与您看到的任何错误都没有关系,但是--您的整个管道可以作为单个命令
awk'/UUID/&&/ext4/{print substr($1,6)}fstab
来编写。您在复制粘贴的错误消息的末尾有一个额外的单引号(与上面包含的内容不同)“
awk'/UUID/&&/ext4/{print substr($1,6)}”fstab
可能的重复在
`
$()
之间是否有实际的区别?@Shahbaz确实如此,
$()
在嵌套结构中工作得更好,而反勾则更为棘手。有一个关于这个的讨论,但我现在找不到。我找到了它,我会把它放在我的答案中。使用
$()
嵌套肯定更清楚,但我的意思是bash有实际的区别吗?他们的行为不同吗?或者它们是同一事物的不同语法?好的,我刚看到你的更新。Dang,我喜欢背底片,它们很容易打字。“沙赫巴兹,我通常用背底片,它们为我工作,但是我注意到如果我做更复杂的事情,我可能想考虑其他的选择。好,这里有个问题:它在终端工作。但是,我希望它在脚本中工作。@ErayTuncer这当然是由于您的脚本中有一个输入错误。应该不需要通过awk传递awk。grep可能也不需要。@jordanm:当然,我的目的是将OP命令影响到shell变量。如果我有5秒钟的时间,我将添加一个较短的命令^^
# Third step : awk use fstab directlty
UUID=$(awk '/UUID.*ext4/ {print substr($1,6)}' /etc/fstab)