例如
#!/bin/bash
sss='ls -l'
$sss
ttt='a=100'
$ttt
ls
的输出正确,但赋值语句将输出错误消息
第5行:a = 100:未找到命令
为什么会有差异?
如果赋值不是命令,它是什么?我的意思是从变量展开的显式a=100
和a=100
之间的区别是什么,我的意思是,bash看到同样的事情a=100
,对吗?为什么他们有不同的解释?
摘要
根据http://guide.bash.academy,一个简单的命令采用
形式[ var=value ... ] name [ arg ... ] [ redirection ... ]
所以我认为作业不是命令。根据heemayl的回答,$
扩展并将bash作为命令运行。这就是$ttt
发出错误的原因。
答案 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