bash running string as command:为什么找不到分配命令?

时间:2017-04-25 03:21:19

标签: bash

例如

#!/bin/bash
sss='ls -l'
$sss
ttt='a=100'
$ttt

ls的输出正确,但赋值语句将输出错误消息

  

第5行:a = 100:未找到命令

为什么会有差异?

如果赋值不是命令,它是什么?我的意思是从变量展开的显式a=100a=100之间的区别是什么,我的意思是,bash看到同样的事情a=100,对吗?为什么他们有不同的解释?

摘要

根据http://guide.bash.academy,一个简单的命令采用

形式
[ var=value ... ] name [ arg ... ] [ redirection ... ]

所以我认为作业不是命令。根据heemayl的回答,$扩展并将bash作为命令运行。这就是$ttt发出错误的原因。

3 个答案:

答案 0 :(得分:2)

这是因为变量扩展的输出作为命令运行,在命令行中精确地替换,就好像你已经按字面插入内容一样。

在这里,你有ttt='a=100',所以当你接下来$ttt时,它将被简单地扩展为a=100,因为这将是运行的唯一参数。而错误是由于显而易见的事实,即这不是一个有效的命令。

您可以使用一些实际有效的命令来扩展扩展,以使扩展成为该命令的参数(例如echo $ttt),如您所想。

如果您需要执行此类作业,请使用declare

$ ttt='a=100'

$ declare "$ttt"

$ echo "$a"
100

答案 1 :(得分:1)

如果要执行代码,请使用函数,而不是参数扩展。

$ sss () { ls -l; }
$ sss
foo.txt bar.txt
$ ttt () { a=100; }
$ ttt
$ printf '%d\n' "$a"
100

答案 2 :(得分:0)

因为a=100不是命令,你无法评估这样的分配。

为了正确评估作业,请尝试:

eval $ttt