2017-04-25 152 views
0

例如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发生错误。

回答

2

这是因为从变量扩展输出运行的命令,正是被替换在命令行中,如果你已插入内容字面上。

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

你可以想象,你可以通过一些实际有效的命令来获取展开作为该命令的参数(例如echo $ttt)。


如果你需要做这样的作业,杠杆declare

$ ttt='a=100' 

$ declare "$ttt" 

$ echo "$a" 
100 
0

因为a=100不是一个命令,你不能评估这样的分配。

为了正确评价分配尝试:

eval $ttt 
+0

嗨,谢谢你的回答。但是我感到困惑,如果分配不是命令,它是什么?我的意思是它仍然不清楚,明确的'a = 100'和'a = 100'之间的区别是从变量扩展而来的,我的意思是,bash看到同样的事情'a = 100',对吧?为什么有不同的解释? – user15964

+0

真的没有区分。 'shell'是shell的别名,内建函数,函数或可执行文件之一,可以通过路径指定,也可以通过'$ PATH'指定的目录列表查找。在你的情况下,'ls'被查找并在'$ PATH'的某个目录中找到,但是,'a = 100'没有被发现。因此,'command not found'错误。 – codeforester

+0

为什么你建议'eval'给新手? – ceving

1

如果要执行的代码,使用功能,而不是一个参数扩展。

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