2013-10-22 60 views
6

我有一個簡單的問題,但我想知道${varname}$varname之間有什麼區別?

我同時使用,但我沒有看到任何區別,可以告訴我什麼時候使用一個或另一個。

回答

10

變量名中使用{}有助於擺脫不確定性的同時進行變量擴展。

考慮兩個變量varvarname。讓我們看看你想追加字符串name到變量var。您不能說$varname,因爲這會導致變量varname的擴展。但是,說${var}name將幫助您達到預期的結果。

$ var="This is var variable." 
$ varname="This is varname variable." 
$ echo $varname 
This is varname variable. 
$ echo ${var}name 
This is var variable.name 

當訪問數組的任何元素時,也需要大括號。

$ a=(foo bar baz)  # Declare an array 
$ echo $a[0]    # Accessing first element -- INCORRECT 
foo[0] 
$ echo ${a[0]}   # Accessing first element -- CORRECT 
foo 

info bash報價:

Any element of an array may be referenced using ${name[subscript]}. 
    The braces are required to avoid conflicts with pathname expansion. 
+0

真實的,但我ncomplete。查看來自fedorqui的帖子 – gentoomaniac

+0

+1這個問題似乎只是問如果沒有其他參數擴展語法需要它們,爲什麼要使用大括號。 – chepner

9

它們在基本情況下是相同的,但是使用${varname}可以提供更多的控制權並且能夠使用變量。它還會跳過可能造成混淆的邊緣案例。最後,它使變量擴展爲Shell Parameter Expansion描述:

的「$」字符引入參數擴展,命令 取代或算術擴展。 擴展的參數名稱或符號可以用大括號括起來,這些大括號是可選的,但可用於 保護變量從緊跟其後的字符 擴展,這可以被解釋爲名稱的一部分。

當使用大括號,括號結束所述匹配是所述第一「}」不 由反斜槓或引用字符串內逃脫,而不是一個 嵌入算術擴展,命令替換,或參數內 膨脹。

參數擴展的基本形式是$ {parameter}。 參數的值被替換。當參數是一個 位置參數與多個數字時,或者當參數是 後跟一個不被解釋爲 名稱的一部分的字符時,需要使用大括號。

我們來看一個基本的例子。在這裏,使用${}允許我們做一些簡單的$不做的事情。考慮到我們想寫$myvar + "blabla" ::

$ myvar=23 
$ echo $myvar 
23 
$ echo $myvarblabla 
         <--- the variable $myvarblabla doesn't exist! 
$ echo ${myvar}blabla 
23blabla 
3

的區別就變得很重要的東西如下的變量時:

text="House" 
plural="${text}s" 

如果沒有括號,外殼會看到texts變量名,其止跌」工作。

大括號也是必要的,當你使用擴展語法來指定默認值(${name-default}),顯示錯誤未定義時(${name?error}),或模式替換(see this article for other patterns;它是BASH但KSH大部分的工作,以及)

> echo $name-default 
-default 
> echo ${name-default} 
default 

相關:

相關問題