如何将 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
到另一个目录并期望$PWD
在pushd
之前持有该目录并且它没有!【参考方案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 命令的输出分配给变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章