26

如何将此结果分配给shell变量?

输入:

echo '1+1' | bc -l

输出:

2

尝试

(没用)

#!bin/sh
a=echo '1+1' | bc -l
echo $a
4

1 回答 1

51

您正在寻找称为命令替换的 shell 功能。

有 2 种形式的 cmd 替换

  1. 原始的,回到石器时代,但完全可移植,并且在所有类 Unix 的 shell(几乎所有)中都可用。

    您将生成值的命令包含在反引号字符中,即

    $ a=`echo 1+1 | bc -l`
    $ echo $a
    2
    $
    
  2. 现代,外观不那么笨重,易于嵌套的 cmd 替换$( cmd ),即

    $ a=$(echo 1+1 |  bc -l)
    $ echo $a
    2
    $
    

您的“she-bang”行说,#!/bin/sh因此,如果您在真正的 Unix 平台上运行,那么您很可能/bin/sh是原始的 Bourne shell,并且需要您使用上面的选项 1。

如果您在仍在使用的同时尝试选项 2#!/bin/sh并且它可以工作,那么您就拥有了现代外壳。尝试输入echo ${.sh.version}or/bin/sh -c --version看看你是否得到任何有用的信息。如果您获得了版本号,那么您将想要了解较新的 shell 包含的额外功能。

说到新功能,如果你真的在使用 bash、zsh、ksh93+,那么你可以将你的示例代码重写为

a=$(( 1+1 ))

或者,如果您正在做更多的数学运算,这将全部留在范围内,您可以使用 shell 特征算术,例如:

(( b=1+1 ))
echo $b
2

在任何一种情况下,您都可以避免创建额外的进程,但您不能在 shell 中进行浮点运算(而您可以使用bc)。

于 2013-04-18T00:57:36.990 回答