Substrings and subarrays
suggest changevar='0123456789abcdef' # Define a zero-based offset $ printf '%s\n' "${var:3}" 3456789abcdef # Offset and length of substring $ printf '%s\n' "${var:3:4}" 3456
# Negative length counts from the end of the string $ printf '%s\n' "${var:3:-5}" 3456789a # Negative offset counts from the end # Needs a space to avoid confusion with ${var:-6} $ printf '%s\n' "${var: -6}" abcdef # Alternative: parentheses $ printf '%s\n' "${var:(-6)}" abcdef # Negative offset and negative length $ printf '%s\n' "${var: -6:-5}" a
The same expansions apply if the parameter is a positional parameter or the element of a subscripted array:
# Set positional parameter $1 set -- 0123456789abcdef # Define offset $ printf '%s\n' "${1:5}" 56789abcdef # Assign to array element myarr[0]='0123456789abcdef' # Define offset and length $ printf '%s\n' "${myarr[0]:7:3}" 789
Analogous expansions apply to positional parameters, where offsets are one-based:
# Set positional parameters $1, $2, ... $ set -- 1 2 3 4 5 6 7 8 9 0 a b c d e f # Define an offset (beware $0 (not a positional parameter) # is being considered here as well) $ printf '%s\n' "${@:10}" 0 a b c d e f # Define an offset and a length $ printf '%s\n' "${@:10:3}" 0 a b # No negative lengths allowed for positional parameters $ printf '%s\n' "${@:10:-2}" bash: -2: substring expression < 0 # Negative offset counts from the end # Needs a space to avoid confusion with ${@:-10:2} $ printf '%s\n' "${@: -10:2}" 7 8 # ${@:0} is $0 which is not otherwise a positional parameters or part # of $@ $ printf '%s\n' "${@:0:2}" /usr/bin/bash 1
Substring expansion can be used with indexed arrays:
# Create array (zero-based indices) $ myarr=(0 1 2 3 4 5 6 7 8 9 a b c d e f) # Elements with index 5 and higher $ printf '%s\n' "${myarr[@]:12}" c d e f # 3 elements, starting with index 5 $ printf '%s\n' "${myarr[@]:5:3}" 5 6 7 # The last element of the array $ printf '%s\n' "${myarr[@]: -1}" f
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents