簡體   English   中英

bash:var = $''內的變量擴展

[英]bash: variable expansion inside var=$' '

我幾乎可以肯定我之前在這里工作過的代碼。 這是一個簡化版本及其產生的內容:

a="atext"
b="btext"
var=$'${a}\n${b}\n'
printf "var=$var"

哪個產生輸出:

var=${a}
${b}

實際代碼輸出var到文件,但變量擴展由於某種原因沒有發生。

如果這不起作用,你能建議一個不錯的替代方式,以及為什么使用$''? 謝謝。

GNU bash,版本4.3.42

$''是一種引用類型,用於允許反斜杠轉義序列描述具有不可打印字符和其他此類奇怪的文字字符串。 因此, $'\\n'計算單個字符 - 換行符 - 而'\\n'"\\n"都計算為兩個字符,第一個是反斜杠,第二個是n


如果您想擁有原始代碼的確切行為 - 在兩個不同擴展的結果之間放置一個文字換行符 - 您可以在字符串中途切換引號類型:

a="atext"
b="btext"
var="$a"$'\n'"$b"
printf '%s' "var=$var"

也就是說,彼此相鄰,之間沒有空格:

"$a"
$'\n'
"$b"

這會給你$a$b擴展,它們之間有一個字面換行符。


為什么這很重要? 請嘗試以下方法:

$ a=atext
$ b=btext
$ var1="$a\n$b"        # Assign with literal "\" and "n" characters
$ printf "$var1"       # Here, printf changes the "\n" into the newline
atext
btext
$ printf '%s' "$var1"  # ...but this form shows that the "\n" are really there
atext\nbtext
$ var2="$a"$'\n'"$b"   # now, we put a single newline in the string
$ printf '%s' "$var2"  # and now even accurate use of printf shows that newline
atext
btext

只需用雙引號替換單引號即可。

$ cat test
a="atext"
b="btext"
var=$"${a}\n${b}\n"
printf "var=$var"
$ sh test
var=atext
btext

對於變量擴展,您需要使用雙引號或無引號。 單引號否定擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM