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

Zen*_*net 153 bash shell

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

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

#!/bin/bash
pwd= `pwd`
until [ $pwd = "/" ]
    do
        echo $pwd
        ls && cd .. && ls 
        $pwd= `pwd` 
    done
Run Code Online (Sandbox Code Playgroud)

你能发现我的错误吗?

Joh*_*don 279

尝试:

pwd=`pwd`
Run Code Online (Sandbox Code Playgroud)

要么

pwd=$(pwd)
Run Code Online (Sandbox Code Playgroud)

请注意等号后面没有空格.

正如韦斯先生指出的那样; 你没有分配$pwd,你分配给pwd.

  • bash中的@AwQiruiGuo` $()`只是用括号执行的命令输出替换它自己; 所以`$(pwd)`会扩展为`/ home/ubuntu`,例如,赋值相当于:`pwd ='/ home/ubuntu'` (4认同)
  • 太好了,非常感谢:) 肯定会记住没有空格和 $ 符号 (2认同)
  • 效果很好,但是在 `$(pwd)` 中 `$()` 是什么意思? (2认同)

Joh*_*iss 25

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

TEST=`pwd`
echo $TEST
Run Code Online (Sandbox Code Playgroud)

这更好(并且可以嵌套)但不像背后的那样可移植:

TEST=$(pwd)
echo $TEST
Run Code Online (Sandbox Code Playgroud)

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


Gil*_*il' 16

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

#!/bin/bash
until [ "$PWD" = "/" ]; do
  echo "$PWD"
  ls && cd .. && ls 
done
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你不能在赋值中使用等号周围的空格:var=value不是var = value
  • $意思是"利用这个变量的值",所以分配当你不使用它:var=value不是$var=value.


Jim*_*Jim 9

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

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

它看起来像这样:

NUM_PROCS=$(ps -e | sed 1d | wc -l)
Run Code Online (Sandbox Code Playgroud)

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