Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Bash命令的输出分配给变量?_Bash_Shell - Fatal编程技术网

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

如何将Bash命令的输出分配给变量?,bash,shell,Bash,Shell,我在将pwd命令的内容放入shell变量(稍后使用)时遇到问题 这是我的shell代码(循环不会停止): 请你找出我的错误好吗?试试: pwd=`pwd` 或 请注意,等号后面没有空格 正如韦斯先生指出的那样;您没有分配给$pwd,而是分配给pwd在shell中,您分配给一个没有美元符号的变量: TEST=`pwd` echo $TEST 这更好(并且可以嵌套),但不像backtics那样可移植: TEST=$(pwd) echo $TEST 始终记住:美元符号仅在读取变量时使用。您还可以

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

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

请你找出我的错误好吗?

试试:

pwd=`pwd`

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


正如韦斯先生指出的那样;您没有分配给
$pwd
,而是分配给
pwd
在shell中,您分配给一个没有美元符号的变量:

TEST=`pwd`
echo $TEST
这更好(并且可以嵌套),但不像backtics那样可移植:

TEST=$(pwd)
echo $TEST

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

您还可以执行更复杂的命令,只需对上述示例进行四舍五入即可。因此,假设我想获取系统上运行的进程数,并将其存储在${NUM_PROCS}变量中

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

它看起来像这样:

NUM_PROCS=$(ps -e | sed 1d | wc -l)
#!/bin/bash
until [ "$PWD" = "/" ]; do
  echo "$PWD"
  ls && cd .. && ls 
done

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

在本例中,请注意bash有一个名为的变量,该变量包含当前目录:
$PWD
相当于
`PWD`
。(其他shell也是如此,这是一个。)因此您可以这样编写脚本:

NUM_PROCS=$(ps -e | sed 1d | wc -l)
#!/bin/bash
until [ "$PWD" = "/" ]; do
  echo "$PWD"
  ls && cd .. && ls 
done
注意在变量引用周围使用双引号。如果变量(此处为当前目录)包含空格或通配符(
\[?*
),则这些字符是必需的,因为shell将变量展开的结果拆分为单词,并对这些单词执行全局搜索。始终双引号变量展开
“$foo”
和命令替换
“$(foo)”
(除非您明确知道您不必这样做)

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

  • 您不能在赋值中的等号周围使用空格:
    var=value
    ,而不是
    var=value
  • $
    表示“获取此变量的值”,因此在赋值时不使用它:
    var=value
    ,而不是
    $var=value
    • 这是您的脚本

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

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

      太好了,非常感谢:)我肯定会记得没有空格和$符号是很好的,但是
      $()
      $(pwd)
      中意味着什么呢?@AwQiruiGuo
      $()
      在bash中只是用大括号执行的命令的输出来替换自己;所以
      $(pwd)
      将扩展到
      /home/ubuntu
      例如,使赋值等效于:
      pwd='/home/ubuntu'
      @JohnWeldon
      cd$pwd/newdir
      如果
      newdir
      存在,这是否有效?@JohnWeldon它所做的不仅仅是执行一个命令并将结果分配给一个变量。它正在创建一个完整的new subshell。使用subshell时,除了捕获命令的结果外,还有很多事情要做。你还可以在循环中添加一个转义图案填充,以防出现错误。例如,
      i=0
      循环的结束。然后在循环内部,
      i=$i+1
      。然后在循环内部,添加类似于
      if[$i>25]然后;break;endif;
      我不确定shell脚本中的循环语法是否会中断,但应该是这样的。记住对变量名使用小写:记住对变量名使用小写:另外,
      echo“$DIR”
      ,带引号;请参阅。使用all caps变量名是一个不幸的决定——all caps名称用于对shell本身有意义的变量,而至少带有一个小写字符的名称保证不会在符合POSIX的shell中产生意外的副作用。例如,在ksh93上,
      JOBMAX
      更改可以同时运行的后台任务的数量;不难想象一个shell使用
      NUM_PROCS
      来完成类似的任务。+1指出
      $PWD
      是bash的一个内部部分。当脚本中有一个
      PWD=`PWD`
      时,这会让人感到困惑,然后
      pushd
      到另一个目录并期望
      $PWD
      pushd
      之前持有dir,但它没有!