2010-02-22 143 views
102

我有一个问题,把pwd命令的内容放到一个我稍后会用到的shell变量中。如何将Bash命令的输出分配给变量?

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

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

你能发现我的错吗?

+0

如果出现问题,您也可以在循环中添加一个逃生舱口。例如循环的“我= 0”。然后在里面,'我= $ i + 1'。然后在循环中添加'if if $ $> 25'之类的东西;打破; endif;'我不确定shell脚本中的语法循环是否中断,但它应该是这样的。 – 2013-04-18 03:55:03

回答

191

尝试:

pwd=`pwd` 

pwd=$(pwd) 

注意等号后没有空格签字。

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

+0

太好了,非常感谢你:) 会明确的记得没有空格和$符号 – Zenet 2010-02-22 22:34:37

+1

很好用,但'$(pwd)'中'$()'是什么意思? – 2015-09-07 07:04:50

+3

@AwQiruiGuo在$ bash中的'$()'只是将自身替换为使用大括号执行的命令的输出;所以'$(pwd)'会扩展到'/ home/ubuntu',例如,使作业等同于:'pwd ='/ home/ubuntu'' – 2015-10-10 21:47:26

19

在外壳分配给一个变量不美元符号:

TEST=`pwd` 
echo $TEST 

那最好不过了(并且可以嵌套),但并不像backtics便携式:

TEST=$(pwd) 
echo $TEST 

一定要记住:美元符号仅在读取变量时使用。

+1

记住为变量名使用小写:http://stackoverflow.com/questions/673055/correct-bash-and-shell-script-variable-大写 – Langston 2015-07-17 13:13:24

7

你也可以做更复杂的命令,以完成上面的例子。因此,假设我想获取系统上正在运行的进程数并将其存储在$ {NUM_PROCS}变量的中。

所有你必须这样做的是生成命令管道和它的输出(进程数)到变量中的东西。

它看起来是这样的:

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

我希望帮助增加一些方便的信息,这一讨论。

14

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

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

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

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

  • 在分配中不能使用空格周围等号:var=value,不 var = value
  • $的意思是“取该变量的值“,因此在分配时不使用它:var=value,而不是 $var=value
1

这里是你的脚本...

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

注意空格,请使用引号,和$迹象。

+0

请记住为变量名使用小写:http://stackoverflow.com/questions/673055/correct-bash-and-shell-script-variable-capitalization – Langston 2015-07-17 13:13:55

相关问题