How to access command-line arguments in Scala shell scripts

This is an excerpt from the Scala Cookbook (partially modified for the internet). This is Recipe 14.11, “How to access command-line arguments in a Scala shell script.”

Problem

You want to access the command-line arguments from your Scala shell script.

Solution

Use the same script syntax as shown in Recipe 14.8, “How to Generate Scala Documentation with scaladoc”, and then access the command-line arguments using the args variable, which is a List[String] that is implicitly made available:

#!/bin/sh
exec scala "$0" "$@"
!#

args.foreach(println)

Save this code to a file named args.sh, make the file executable, and run it like this:

$ ./args.sh a b c
a
b
c

Discussion

Because the implicit field args is a List[String], you can perform all the usual operations on it, including getting its size, and accessing elements with the usual syntax.

In a more “real-world” example, you’ll check for the number of command-line arguments, and then assign those arguments to values. This is demonstrated in the following script:

#!/bin/sh
exec scala "$0" "$@"
!#
if (args.length != 2) {
    Console.err.println("Usage: replacer <search> <replace>")
    System.exit(1)
}

val searchPattern = args(0)
val replacePattern = args(1)
println(s"Replacing $searchPattern with $replacePattern ...")

// more code here ...

When this script is run from the command line without arguments, the result looks like this:

$ ./args.sh
Usage: replacer <search> <replace>

When it’s run with the correct number of arguments, the result looks like this:

$ ./args.sh foo bar
Replacing foo with bar ...

Using the App trait

If you decide to use the App trait in your script, make sure you pass the command-line arguments to your App object, as shown in the Hello.main(args) line in this example:

#!/bin/sh
exec scala "$0" "$@"
!#
object Hello extends App {
    println("Hello, world")
    // if you want to access the command line args:
    //args.foreach(println)
}

Hello.main(args)

Use the same syntax if you use a main method instead of an App object.