簡體   English   中英

Bash 參數擴展和數組索引操作

[英]Bash parameter expansion and array index operations

${parameter,,pattern}參數擴展將參數中的字母字符轉換為小寫。

cygwin 1.7.11-1 Bash 4.1.10(4)和我的debian squeeze Bash 4.1.5(1)上;
如果我運行以下命令,我會得到一個奇怪的結果:

$ declare -a a=(Zero One Two Three); n=0; echo "${a[n],,}->${n}"; echo "${a[++n]}->${n}"; echo "${a[++n],,}->${n}"
zero->0
One->1
three->3
$

注意:類似的結果發生:
用於,,*^^大小寫轉換;
對於其他一些擴展,例如${parameter##word}
用於使用前綴/后綴++--運算符;
使用$((++n))而不僅僅是++n

但是,長度擴展${#parameter}的工作方式與我預期的一樣:
在上面的片段中, echo "${#a[++n]}->${n}"而不是echo "${a[++n],,}->${n}會產生3->2而不是three->3 ~& a[2]="two" 的長度確實是 3 個字符。


我想參數擴展發生了兩次。 但是為什么會這樣呢?

我抓取了最新的 bash 源代碼,看來此版本已解決此問題:

$ ./bash --version
GNU bash, version 4.2.24(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
$

但是請注意,在我的 Debian Squeeze stable上,我有:

$ apt-cache policy bash
bash:
  Installed: 4.1-3
  Candidate: 4.1-3
  Version table:
 *** 4.1-3 0
        500 http://ftp.uk.debian.org/debian/ squeeze/main amd64 Packages
        100 /var/lib/dpkg/status
$
$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>


我認為這意味着目前在Debian Squeeze上,bash 的最新穩定版本是4.1.5(1)並且包含此錯誤。 同樣在Cygwin 1.7.11-1上,當前最新可用的 bash package 似乎是版本4.1.10(4)並且包含此錯誤。 當然這個問題很容易解決,所以不需要構建4.2源代碼。

我有

Zero->0
One->1
Two->2

但是我認為 "${a[++n]}->${n}" 可能沒有明確定義。

嘗試用

let n=$n+1 ; echo "${a[n],,}->${n}";

注入序列的概念。

暫無
暫無

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

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