This is a friendly comparison of the syntax of different shells!
| oil | shpp | |
| source | 
# oil requires quotes
echo 'hello world'
const name = 'world'
echo "hello $name"
 | # no single quotes echo hello world name = "world" echo "hello ${name}" # braces required | 
| output | hello world hello world | hello world hello world | 
| oil | shpp | |
| source | 
if test --exists /bin/grep {
  echo 'file exists'
}
 | 
if path("/bin/grep").exists() {
  echo "file exists"
}
 | 
| output | file exists | file exists | 
| oil | shpp | |
| source | ls src* | sort -r | head -n 3 | ls src* | sort -r | head -n 3 | 
| output | src5 src4 src3 | ./src5 ./src4 ./src3 | 
| oil | shpp | |
| source | echo hello | read --line # _line starts with _, so it's a # "register" mutated by the interpreter echo "line: $_line" | 
# not sure how to feed stdin
line = read()
print("line: ", line)
 | 
| output | line: hello | line: [null] | 
| oil | shpp | |
| source | 
# TODO: Oil could expose strerror() like shpp
try zzz
if (_status === 127) {
  echo "zzz not installed"
}
 | 
try {
  zzz
} catch InvalidCmdException as ex {
  print("zzz not installed [msg: ", ex, "]")
}
 | 
| output | zzz not installed | zzz not installed [msg: zzz: No such file or directory] | 
| oil | shpp | |
| source | const array1 = ['physics', 'chemistry', 1997, 2000] const array2 = [1, 2, 3, 4, 5, 6, 7] write -- "array1[0]: $[array1[0]]" # TODO: Oil needs @[] const slice = array2[1:5] write -- "array2[1:5]" @slice # use the word language: bare words, glob, brace expansion const shell_style = %( README.md *.py {alice,bob}@example.com ) write -- @shell_style | 
array1 = ["physics", "chemistry", 1997, 2000];
array2 = [1, 2, 3, 4, 5, 6, 7 ];
print("array1[0]: ", array1[0])
print("array2[1:5]: ", array2[1:5])
 | 
| output | array1[0]: physics array2[1:5] 2 3 4 5 README.md bar.py foo.py alice@example.com bob@example.com | array1[0]: physics array2[1:5]: [2, 3, 4, 5] |