# Substrings and subarrays

suggest change
``````var='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``````