将命令的输出赋值给变量(BASH)

7
我需要将命令的输出分配给一个变量。我尝试的命令是:
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)}'
 )'

4
你确定你正在使用bash吗?看起来很好,但是确切的错误是什么呢? - chepner
4
这可能与您看到的任何错误无关,但是您的整个管道可以编写为单个命令awk '/UUID/ && /ext4/ { print substr($1, 6) }' fstab - ruakh
1
你在复制粘贴错误信息时,在末尾多了一个单引号(与你上面所包含的不同)。 - sshannin
awk '/UUID/ && /ext4/ {print substr($1,6)}' fstab - tripleee
可能是重复的问题:如何将BASH变量设置为命令输出的值? - Jahid
2个回答

15

使用 '$()' 子 shell 运算符是获取 bash 命令输出的常见方法。由于它涉及子 shell,因此效率不是很高。

我尝试过:

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)

好的,这里是问题: 它在终端上可以工作。但是,我希望它能在脚本中工作。 - Eray Tuncer
@ErayTuncer 这肯定是你脚本中的一个打字错误导致的。 - Charles Duffy
1
不应该需要通过awk管道传递awk。grep也可能不需要。 - jordanm
@jordanm:当然可以,我的意思是将OP命令影响到一个shell变量上。如果我有5秒钟的话,我会添加一个更短的命令^^ - neuro

2
仅供故障排除目的,还有另一种尝试方法来使其工作,您也可以尝试使用“反引号”,例如:
cur_dir=`pwd`

pwd 命令的输出保存在变量 cur_dir 中,尽管使用 $() 方法通常更可取。
从我在 http://unix.stackexchange.com 上获得的页面中 引用

第二种形式的 `COMMAND`(使用反引号)在 Bash 中已经有些过时了,因为它在嵌套时存在一些问题(需要转义“内部”反引号和转义字符)。使用 $(COMMAND),它也是 POSIX 标准!


“``”和“$()”之间实际上有区别吗? - Shahbaz
@Shahbaz,有的,$() 在嵌套结构中的表现更好,而反引号则会更棘手。关于这个问题在 http://unix.stackexchange.com 上有过讨论,但我现在找不到了。如果我找到了,我会把它放在我的答案里。 - Levon
使用 $() 嵌套肯定更清晰,但我的意思是在 bash 中是否有实际区别?它们的行为是否不同?还是它们只是相同事物的不同语法? - Shahbaz
好的,我刚刚看到了你的更新。哎呀,我喜欢反引号,打起来太容易了。 - Shahbaz
@Shahbaz 我通常使用反引号,它们对我很有效,但我意识到如果我做一些更复杂的事情,我可能需要考虑其他选择。 - Levon
$()和反引号之间的主要区别是,不幸的是,仍然有一些正在使用的shell无法识别$()语法。(即使它已经标准化了20多年!)在bash中没有区别。 - William Pursell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接