1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
#!/bin/bash
# trimmed down version of:
# https://github.com/kenshaw/shell-config/blob/master/scripts/go-setup.sh
ARCH=$(uname -m)
PLATFORM=linux
case $ARCH in
aarch64) ARCH=arm64 ;;
x86_64) ARCH=amd64 ;;
esac
REPO=https://go.googlesource.com/go
DL=https://go.dev/dl/
EXT=tar.gz
DEST=/usr/local
set -e
LATEST=$(curl -4 -s "$DL"|sed -E -n "/<a .+?>go1\.[0-9]+(\.[0-9]+)?\.$PLATFORM-$ARCH\.$EXT</p"|head -1)
ARCHIVE=$(sed -E -e 's/.*<a .+?>(.+?)<\/a.*/\1/' <<< "$LATEST")
STABLE=$(sed -E -e 's/^go//' -e "s/\.$PLATFORM-$ARCH\.$EXT$//" <<< "$ARCHIVE")
if ! [[ "$STABLE" =~ ^1\.[0-9\.]+$ ]]; then
echo "ERROR: unable to retrieve latest Go version for $PLATFORM/$ARCH ($STABLE)"
exit 1
fi
REMOTE=$(sed -E -e 's/.*<a .+?href="(.+?)".*/\1/' <<< "$LATEST")
VERSION="go$STABLE"
OPTIND=1
while getopts "v:" opt; do
case "$opt" in
v) VERSION=$OPTARG ;;
esac
done
# prefix passed version with go
if [[ "$VERSION" =~ ^1\.[0-9]+ ]]; then
VERSION="go$VERSION"
fi
if ! [[ "$VERSION" =~ ^go1\.[0-9]+\.[0-9]+$ ]]; then
echo "ERROR: invalid Go version $VERSION"
exit 1
fi
if ! [[ "$REMOTE" =~ "^https://" ]]; then
REMOTE="https://go.dev$REMOTE"
fi
echo "ARCH: $PLATFORM/$ARCH"
echo "DEST: $DEST"
echo "STABLE: $STABLE ($REMOTE)"
echo "VERSION: $VERSION"
grab() {
echo "RETRIEVING: $1 -> $2"
curl -4 -L -# -o $2 $1
}
# extract
WORKDIR=$(mktemp -d /tmp/go-setup.XXXX)
grab $REMOTE $WORKDIR/$ARCHIVE
echo "USING: $WORKDIR/$ARCHIVE"
pushd $WORKDIR &> /dev/null
case $EXT in
tar.gz) tar -zxf $ARCHIVE ;;
zip) unzip -q $ARCHIVE ;;
*)
echo "ERROR: unknown extension $EXT"
exit
;;
esac
echo "MOVING: $WORKDIR/go -> $DEST/go"
mv go $DEST/go
chown -R root:root $DEST/go
echo "INSTALLED: $($DEST/go/bin/go version)"
|