如何将Bash命令的输出分配给变量?

时间:2010-02-22 22:25:31

标签: bash shell

我在将pwd命令的内容放入shell变量时遇到问题,稍后我将使用它。

这是我的shell代码(循环不会停止):

#!/bin/bash
pwd= `pwd`
until [ $pwd = "/" ]
    do
        echo $pwd
        ls && cd .. && ls 
        $pwd= `pwd` 
    done

你能发现我的错误吗?

5 个答案:

答案 0 :(得分:259)

尝试:

pwd=`pwd`

pwd=$(pwd)

注意等号后面没有空格。

韦斯先生也指出了这一点;您未分配到$pwd,而是指定给pwd

答案 1 :(得分:25)

在shell中,您分配给没有美元符号的变量:

TEST=`pwd`
echo $TEST

更好(并且可以嵌套),但不像背景那样可移植:

TEST=$(pwd)
echo $TEST

永远记住:美元符号仅在读取变量时使用。

答案 2 :(得分:16)

在这种特定情况下,请注意bash有一个名为PWD的变量,其中包含当前目录:$PWD等同于`pwd`。 (所以其他shell也是standard feature。)所以你可以这样编写你的脚本:

#!/bin/bash
until [ "$PWD" = "/" ]; do
  echo "$PWD"
  ls && cd .. && ls 
done

请注意在变量引用周围使用双引号。如果变量(这里是当前目录)包含空格或通配符(\[?*),则它们是必需的,因为shell将变量扩展的结果拆分为单词并对这些单词执行通配。 始终双引号变量扩展"$foo"和命令替换"$(foo)" (除非您明确知道自己没有)。

在一般情况下,正如其他答案已经提到的那样:

  • 您不能在作业中使用等号周围的空格:var=value,而不是 var = value
  • $表示“获取此变量的值”,因此在分配时不要使用它:var=value,而不是 $var=value 。< / LI>

答案 3 :(得分:7)

你也可以做更复杂的命令,只是为了完善上面的例子。所以,假设我想获得系统上运行的进程数,并将其存储在 $ {NUM_PROCS} 变量中。

您只需要生成命令管道并将其输出(进程计数)填充到变量中。

它看起来像这样:

NUM_PROCS=$(ps -e | sed 1d | wc -l)

我希望这有助于为此次讨论添加一些方便的信息。

答案 4 :(得分:2)

这是你的剧本......

DIR=$(pwd)
echo $DIR
while [ "$DIR" != "/" ]; do
    cd ..
    DIR=$(pwd)
    echo $DIR
done

请注意空格,引号的使用和$符号。