将命令的输出分配给variables(BASH)

我需要将一个命令的输出分配给一个variables。 我试过的命令是:

grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}' 

我尝试这个代码来分配一个variables:

 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)}' )' 

那么使用'$()'子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) 

只是为了解决问题的目的,还有一些其他的方法可以试着去看看你能否得到这个工作,你也可以尝试使用“反引号”,例如,

 cur_dir=`pwd` 

会将pwd命令的输出保存在变量cur_dir中,尽管使用$()方法通常更可取。

引用 http://unix.stackexchange.com上的一个页面:

第二种形式`COMMAND` (使用反引号)或多或少已经不适合Bash了,因为嵌套有一些问题(“内部反引号”需要转义)和转义字符。 使用$(COMMAND) ,这也是POSIX!