Tom Dworzanski Tom Dworzanski - 3 months ago 18
Ruby Question

Install Latest Stable Version of Ruby Using rbenv

I want to install the latest stable version of Ruby available with rbenv. This feature won't be happening in rbenv itself.

When I run the command

rbenv install -l
in my shell, I get a long list of available versions. The list has all types of entries. The following is a partial list to demonstrate the format and diversity:

$ rbenv install -l
Available versions:
2.0.0-p643
2.0.0-p645
2.1.0-dev
2.1.0-preview1
2.1.0-preview2
2.1.0-rc1
2.1.4
2.1.5
2.1.6
2.2.0-dev
2.2.0-preview1
2.2.0-preview2
2.2.0-rc1
2.2.0
2.2.1
2.2.2
2.3.0-dev
jruby-1.7.19
jruby-1.7.20
jruby-9.0.0.0-dev
jruby-9.0.0.0+graal-dev
jruby-9.0.0.0.pre1
jruby-9.0.0.0.pre2
maglev-1.0.0
maglev-1.1.0-dev
maglev-2.0.0-dev
mruby-dev
mruby-1.0.0
mruby-1.1.0
rbx-2.5.2
rbx-2.5.3
ree-1.8.7-2011.12
ree-1.8.7-2012.01
ree-1.8.7-2012.02
topaz-dev


My goal is to automate the command
rbenv install VERSION
in a shell script where
VERSION
is the highest
x.x.x
release. In other words, I need to automatically substitute the highest entry on the list that starts with a number and does not end with
-something
into
VERSION
. From this list, I need
2.2.2
.

What can I put in my shell script to automatically pick the highest
x.x.x
version in the command
rbenv install x.x.x
?

Edit: Since Ruby is not yet installed, the solution has to be in Bash and not Ruby.

Edit 2: I want the MRI (mainstream) version of Ruby.

Answer
rbenv install -l | awk -F '.' '
   /^[[:space:]]*[0-9]+\.[0-9]+\.[0-9]+[[:space:]]*$/ {
      if ( ($1 * 100 + $2) * 100 + $3 > Max ) { 
         Max = ($1 * 100 + $2) * 100 + $3
         Version=$0
         }
      }
   END { print Version }'
  • Take the biggest version (sorted order or not)

If list is sorted a simpler sed (posix version) is enough

rbenv install -l | sed -n '/^[[:space:]]*[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}[[:space:]]*$/ h;${g;p;}'