Here is an example of a Bash-script which is using a here-document embedding a Python script which will parse a version number.
Bash script file parse_version.sh:
#!/bin/bash
#
# parse_version.sh
#
PYTHON="python3"
function parse_version() {
local VERSIONSTR="$@"
VER=$(${PYTHON} - <<EOF
import re
s = '$VERSIONSTR'
PATTERNS = [
r'\s([\d\.]+)\/[\d]+$', # 4.22.3/20060821 => 4.22.3
r'\s([\d\.]+)\s[\d\.]+$', # 3.35.2 20110222 => 3.35.2
r'\s([\d\.]+)\.\d{8}$', # 2.39.50.20220821 => 2.39.50
r'\s([\d\.]+)$' # 2.38 => 2.38
]
for p in PATTERNS:
m = re.search(p, s)
if m is not None:
# Found valid version string
v = m.group(1)
print(v)
exit(0)
# Did not find valid version string
print('None')
exit(1)
EOF
)
}
#
# Run tests for the given test version strings
#
VERSIONS=( \
"1 GNU ld (GNU Binutils for Ubuntu) 2.38" \
"2 GNU ld (GNU Binutils for Ubuntu) 4.22.3/20060821" \
"3 GNU ld (GNU Binutils for Ubuntu) 3.35.2 20110222" \
"4 GNU ld (2.34-4ubuntu1+13ubuntu1) 2.3" \
"5 GNU ld (GNU Arm Embedded Toolchain 9-2020-q2-update) 2.34.0.20200428" \
"6 GNU ld (GNU Arm Embedded Toolchain 10.3-2021.10) 2.36.1.20210621" \
"7 GNU ld (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 2.37.20220122" \
"8 GNU ld (Arm GNU Toolchain 12.2.MPACBTI-Bet1 (Build arm-12-mpacbti.16)) 2.39.50.20220821" \
"9 GNU ld (Zephyr SDK 0.15.2) 2.38" \
"10 GNU ld (Zephyr SDK 0.15.2)" \
"11 GNU ld (Zephyr SDK 0.15.2) 1.2.H")
for v in "${VERSIONS[@]}"; do
parse_version $v
echo "Exit code=$?, Version='$VER'"
done
Produced output:
$ ./parse_version.sh
Exit code=0, Version='2.38'
Exit code=0, Version='4.22.3'
Exit code=0, Version='3.35.2'
Exit code=0, Version='2.3'
Exit code=0, Version='2.34.0'
Exit code=0, Version='2.36.1'
Exit code=0, Version='2.37'
Exit code=0, Version='2.39.50'
Exit code=0, Version='2.38'
Exit code=1, Version='None'
Exit code=1, Version='None'