2

I'm looking through a bash script I've inherited and come across this line:

local n=${x##*wlan}

I've never seen this syntax, I know that local means a variable in the scope of a function, I'm just unsure about the ${*##} part and it's pretty tricky to google that syntax.

James
  • 3,957
  • 4
  • 37
  • 82

2 Answers2

6

It removes everything up to the last wlan match in the $x variable.

asldkjflkasjdfljsdwlanalsdkjfkajsdflswlanasdlfaksdlfj
#                 ^^^^               ^^^^
#                     |                  |--->
#                     |                  ${x##*wlan}
#                     ${x#*wlan}

See an example:

$ x="hello1hello2hello3"

$ echo "${x##*hello}"  # with two ## it matches the longest matching pattern
3

$ echo "${x#*hello}"   # with one # it matches the shortest matching pattern
1hello2hello3

Graphically:

hello1hello2hello3
#                ^
#    ^           ${x##*hello}
#    ${x#*hello}

From Bash Reference Manual - 3.5.3 Shell Parameter Expansion:

${parameter##word}

The word is expanded to produce a pattern just as in filename expansion (see Filename Expansion). If the pattern matches the beginning of the expanded value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the ‘#’ case) or the longest matching pattern (the ‘##’ case) deleted. If parameter is ‘@’ or ‘’, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with ‘@’ or ‘’, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.

fedorqui
  • 275,237
  • 103
  • 548
  • 598
3

It's called parameter substitution/expansion, see here for more information.

Your example removes the longest match of *wlan from the beginning of the variable $x.

Adrian Frühwirth
  • 42,970
  • 10
  • 60
  • 71