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