如何将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'
@JohnWeldoncd$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,但它没有!