亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Bash中的eval命令及其典型用法

Bash中的eval命令及其典型用法

慕絲7291255 2019-12-02 08:04:13
在閱讀了bash手冊頁并針對此帖子之后。我仍然很難理解該eval命令的確切功能以及它的典型用法。例如,如果我們這樣做:bash$ set -- one two three  # sets $1 $2 $3bash$ echo $1onebash$ n=1bash$ echo ${$n}       ## First attempt to echo $1 using brackets failsbash: ${$n}: bad substitutionbash$ echo $($n)       ## Second attempt to echo $1 using parentheses failsbash: 1: command not foundbash$ eval echo \${$n} ## Third attempt to echo $1 using 'eval' succeedsone這里到底發生了什么,美元符號和反斜杠如何與問題聯系在一起?
查看完整描述

3 回答

?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

eval將字符串作為其參數,并對其進行求值,就好像您在命令行上鍵入了該字符串一樣。(如果您傳遞幾個參數,則它們首先會以空格隔開。)


${$n}是bash中的語法錯誤。在大括號內,您只能具有一個變量名,并帶有一些可能的前綴和后綴,但是您不能具有任意的bash語法,尤其是不能使用變量擴展。盡管有這樣一種說法:“名稱在此變量中的變量的值”:


echo ${!n}

one

$(…)在子外殼程序(即在一個單獨的進程中,該命令在圓括號內)中運行,該命令繼承了當前外殼程序的所有設置(例如變量值),并收集其輸出。因此echo $($n),$n作為shell命令運行,并顯示其輸出。由于$n計算為1,因此$($n)嘗試運行該命令1,該命令不存在。


eval echo \${$n}運行傳遞給的參數eval。展開后,參數為echo和${1}。因此eval echo \${$n}運行命令echo ${1}。


需要注意的是大部分的時間,因此必須將變量替換和命令替換雙引號(即隨時有一個$)"$foo", "$(foo)"。始終在變量和命令替換兩邊加上雙引號,除非您知道需要將其省略。沒有雙引號,外殼程序將執行字段拆分(即,它將變量的值或命令的輸出拆分為單獨的單詞),然后將每個單詞視為通配符模式。例如:


$ ls

file1 file2 otherfile

$ set -- 'f* *'

$ echo "$1"

f* *

$ echo $1

file1 file2 file1 file2 otherfile

$ n=1

$ eval echo \${$n}

file1 file2 file1 file2 otherfile

$eval echo \"\${$n}\"

f* *

$ echo "${!n}"

f* *

eval不經常使用。在某些Shell中,最常見的用法是獲取變量的值,該變量的名稱直到運行時才知道。在bash中,由于${!VAR}語法原因,這不是必需的。eval當您需要構建包含運算符,保留字等的較長命令時,它仍然很有用。




查看完整回答
反對 回復 2019-12-03
  • 3 回答
  • 0 關注
  • 552 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號