2017-06-02 74 views
0

我正在使用Bourne Shell。需要確認我對以下內容的理解是否正確?

$ echo $SHELL 
/bin/bash 

$ VAR="NJ:NY:PA" <-- declare an array with semicolon as separator? 

$ echo ${VAR#*} <-- show entire array without separator? 
NJ:NY:PA 

$ echo ${VAR#*:*} <-- show array after first separator? 
NY:PA 

$ echo ${VAR#*:*:*} <-- show string after two separator 
PA 
+1

不,不是這樣的。你的代碼中沒有數組。 – melpomene

+0

好的。所以VAR被視爲字符串,echo僅僅通過將冒號(:)作爲分隔符來打印子字符串 – oradbanj

+0

閱讀精美的手冊:https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter -Expansion – melpomene

回答

2

${var#pattern}parameter expansion展開至的$var與從字符串的前去除可能的最短匹配爲pattern的值。

因此,${VAR#*:}消除了一切,包括第一個:; ${VAR#*:*:}刪除一切,包括第二個:

尾隨* S於在問題中給出的擴展結束沒有任何用處,而且應避免:沒有理由去用${var#*:*:*},而不是${var#*:*:} - 因爲這些文字匹配的最小量可能的,並且允許*擴展爲0個字符,最後的*匹配並刪除任何內容。


如果你真的什麼是一個數組,你可以考慮使用一個真正的數組來代替。

# read contents of string VAR into an array of states 
IFS=: read -r -a states <<<"$VAR" 
echo "${states[0]}" # will echo NJ 
echo "${states[1]}" # will echo NY 
echo "${#states[@]}" # count states; will emit 3 

...這也給了你寫的能力:

printf ' - %s\n' "${states[@]}" # put *all* state names into an argument list