你如何解释Bourne Shell中的$ {VAR#*:*:*}

时间:2017-06-02 21:14:30

标签: linux bash shell

我正在使用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 个答案:

答案 0 :(得分:2)

${var#pattern}是一个parameter expansion,可以扩展到$var的值,并且从字符串的前面删除pattern的最短匹配。

因此,${VAR#*:}会删除所有内容,包括第一个:; ${VAR#*:*:}删除所有内容,包括第二个:

问题中扩展结尾的*结尾没有任何用处,应该避免:没有任何理由可以使用${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