2017-04-25 94 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