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

我有一个问题,把pwd命令的内容放入一个shell变量,我将稍后使用。

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

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

你能指出我的错误吗?

371081 次浏览

试一试:

pwd=`pwd`

pwd=$(pwd)

注意等号后面没有空格。

Weiss先生还指出;你不会赋值给$pwd,而是赋值给pwd

在shell中,你赋值给一个不带$符号的变量:

TEST=`pwd`
echo $TEST

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

TEST=$(pwd)
echo $TEST

永远记住:$符号只在读取变量时使用。

您还可以执行更复杂的命令,只是为了完善上面的示例。因此,假设我想获取系统上运行的进程数,并将其存储在$ {NUM_PROCS}变量中。

您所要做的就是生成命令管道,并将其输出(进程计数)填充到变量中。

它看起来是这样的:

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

我希望这有助于为这个讨论添加一些有用的信息。

在这种情况下,请注意bash有一个名为PWD的变量,该变量包含当前目录:$PWD等价于`pwd`。(其他shell也是如此,这是标准功能。)所以你可以这样写你的脚本:

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

注意在变量引用周围使用双引号。如果变量(这里是当前目录)包含空格或通配符(\[?*),它们是必要的,因为shell将变量展开的结果拆分为单词,并对这些单词执行通配符。总是双引号变量展开__ABC1和命令替换"$(foo)"(除非你明确知道你不需要这样做)。

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

  • 在赋值操作中,不能在等号周围使用空格:var=value,而不是var = value
  • $表示“取这个变量的值”,所以在赋值:var=value而不是$var=value时不要使用它。

这是你的剧本……

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

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