如何将 Bash 命令的输出分配给变量? [复制]

Posted

技术标签:

【中文标题】如何将 Bash 命令的输出分配给变量? [复制]【英文标题】:How to assign the output of a Bash command to a variable? [duplicate] 【发布时间】:2011-01-19 20:40:33 【问题描述】:

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

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

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

你能看出我的错误吗?

【问题讨论】:

您还可以在循环中添加一个逃生舱口,以防出现问题。例如i=0 超出循环。然后在里面,i=$i + 1。然后也在循环内,添加类似if [ $i > 25 ] then; break; endif;的东西我不确定循环在shell脚本中的语法中断,但它应该是这样的。 【参考方案1】:

试试:

pwd=`pwd`

pwd=$(pwd)

注意等号后面没有空格。

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

【讨论】:

太好了,非常感谢 :) 一定会记住没有空格和 $ 符号 效果很好,但是$()$(pwd) 中是什么意思? bash 中的 @AwQiruiGuo $() 只是将自身替换为用大括号执行的命令的输出;所以$(pwd) 将扩展为/home/ubuntu,例如,使赋值相当于:pwd='/home/ubuntu' @JohnWeldon cd $pwd/newdir 如果newdir 存在,这是否有效? @JohnWeldon 它不仅仅是执行命令并将结果分配给变量。它正在创建一个全新的子外壳。除了捕获命令的结果之外,使用子shell 时还有很多事情要做。【参考方案2】:

这是你的脚本...

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

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

【讨论】:

记得使用小写的变量名:***.com/questions/673055/… 另外,echo "$DIR",带引号;见BashPitfalls #14。【参考方案3】:

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

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

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

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

您不能在赋值中的等号周围使用空格:var=value,而不是 var = value $ 的意思是“取这个变量的值”,所以在赋值时不要使用它:var=value,而不是 $var=value

【讨论】:

+1 指出 $PWD 是 bash 的内部部分。当您的脚本中有PWD=`pwd` 然后您将pushd 到另一个目录并期望$PWDpushd 之前持有该目录并且它没有!【参考方案4】:

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

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

看起来像这样:

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

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

【讨论】:

使用全大写的变量名是一个不幸的决定——全大写的名字用于对 shell 本身有意义的变量,而至少有一个小写字符的名字保证没有符合 POSIX 标准的外壳中的意外副作用。例如,在 ksh93 上,JOBMAX 改变了一次可以运行的后台任务的数量;不难想象一个 shell 使用 NUM_PROCS 来做类似的事情。【参考方案5】:

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

TEST=`pwd`
echo $TEST

这样更好(并且可以嵌套),但不如 backtics 便携:

TEST=$(pwd)
echo $TEST

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

【讨论】:

记得使用小写的变量名:***.com/questions/673055/… 记得quote your variables。

以上是关于如何将 Bash 命令的输出分配给变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串列分配给变量并在 Bash 脚本的输出中引用它

将输出分配给Bash中的变量[重复]

如何将插入的输出值分配给 sql server 中的变量? [复制]

如何将curl的输出捕获到bash中的变量[重复]

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

期望脚本:获取 bash 命令的输出并设置变量