【问题标题】:Bash: Assign command to a variableBash:将命令分配给变量
【发布时间】:2021-06-11 16:13:04
【问题描述】:

下面我有一个让我有点困惑的例子,任何帮助将不胜感激。

我将一个普通的命令行命令 (ls) 绑定到一个新变量。如果我回显它,输出只是命令(ls)但是如果我只使用没有回显的变量,我会得到命令的结果,但是为什么?是因为 $listdir 被翻译成 ls 所以我只得到输出吗?如果我使用 echo 命令,它会被解释为字符串吗?

router@test:~/scripting$ listdir=ls
router@test:~/scripting$ echo "$listdir"
ls

----- VS ----
router@test:~/scripting$ $listdir
basicLoop.sh         fileflood.sh .......

感谢您的帮助!

【问题讨论】:

  • 您期望的行为是什么?
  • $listdir 被扩展,扩展的第一个词(这里是ls,也是这种情况下的唯一词)被解释为命令,如果有的话,后续的词, 作为参数。
  • 呃,我认为这里唯一的答案是 Yes。不够发帖!

标签: bash variables output


【解决方案1】:

当 bash 解释你提供给它的命令时,它会做的第一件事就是扩展它给出的任何扩展。所以当你给它$listdir 时,当bash 开始执行它所给定的值时,它所知道的只是它被赋予了ls 的值。它不关心值来自哪里,只关心值是什么。

让我们看看运行set -x 后给出的跟踪,它指示 bash 在扩展之后和执行之前打印到stderr

$> echo $listdir
+ echo ls
ls

$> $listdir
+ ls
file_0 file_1

如您所见,在第二行中,bash 将尝试运行命令 ls,就好像您明确调用了 ls 甚至 /usr/bin/ls

编辑

扩展不是 shell 评估的第一步,有关详细信息,请参阅@Gordon Davisson 的评论

【讨论】:

  • 更正:扩展变量并不是 shell 做的第一件事。最重要的是,它出现在 shell 解析引号和转义符、命令分隔符(;& 等)和重定向(>< 等)之后,所以如果你包括其中之一在变量中,它不会被识别。因此,您可以将 simple 命令存储在变量中,但不能将复杂的命令存储在变量中。无论如何,这通常被认为是一个坏主意。变量用于数据,而不是可执行代码。见BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!
【解决方案2】:

通过执行listdir=ls,您实际上将字符串“ls”分配给$listdir 变量。因此,如果您现在运行echo $listdir,它将扩展为echo ls,它(您可能已经猜到)只会在屏幕上打印“ls”。如果您想将命令的结果存储到变量中,可以将命令包装在``$()(例如listdir=$(ls)listdir=`ls`)中。

jarmusz@emacs~$ listdir=`ls`
jarmusz@emacs~$ echo "$listdir"
dls
docs
music
...

如果您只想存储命令的名称并稍后运行,您可以这样做:

jarmusz@emacs~$ listdir=ls
<some other commands...>
jarmusz@emacs~$ echo `$listdir`
dls docs music ...

在本例中,echo `$listdir` 将扩展为 echo `ls`,然后扩展为 echo dls docs music...

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 2011-01-23
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多