User Guide: Rosetta Stone

A tabulated list of Bashism’s and their equivalent murex syntax

Below is a reference table of common Bash code and how it could be written in murex.

It is also recommended that you read the language tour if you want to learn more about shell scripting in murex.

Description Bash Murex
Write to STDOUT echo "Hello Bash" out "Hello Murex"

echo "Hello Murex" [1]
Write to STDERR echo "Hello Bash" >2 err "Hello Murex"
Write to file (truncate) echo "Hello Bash" > hello.txt echo "Hello Murex" |> hello.txt
Write to file (append) echo "Hello Bash" >> hello.txt echo "Hello Murex" >> hello.txt
Pipe commands echo "Hello Bash | grep Bash echo "Hello Murex | grep Murex

out "Hello Murex" -> regexp m/Murex/
Redirect errors to STDOUT curl murex.rocks 2>&1 | less curl murex.rocks ? less

curl <!out> murex.rocks | less
Redirect output to STDERR uname -a >&2 uname <err> -a

Quoting strings
Infixing echo "Hello $SHELL" out "Hello $SHELL"
String literals echo 'Hello' $SHELL out 'Hello' $SHELL
Nesting quotes echo 'Hello \'Bob\'' out %(Hello 'Bob')

Process management
Exit number $? exitnum
Background jobs command & bg { command }
Job control ps,
jobs,
bg pid,
fg pid
fid-list,
jobs,
bg fid,
fg fid
Happy paths command && command command && command

try {command; command}
Unhappy paths command || command command || command

try {command}; catch {command}
Pipe fail set -o pipefail runmode trypipe module

runmode trypipe function

trypipe { commands }

Comments
Single line # comment # comment
Multiple lines n/a /#
line 1
line 2
#/
Mid-line n/a eg out foo/#comment#/bar

File pattern matching
(also known as “wildcards”)
Globbing eg ls *.txt eg ls *.txt (in the interactive terminal)

g pattern

eg ls @{g *.txt}
Regexp n/a rx pattern

eg ls @{rx '*\\.txt'}
File type matching n/a f flags

eg f +s (only return symlinks)
Chaining n/a eg f +f | g *.txt | !g murex.*
(returns only files with the extension “txt” that aren’t called “murex”)

Expressions
Assignment foobar = $((1 + 2 * 3)) foobar = 1 + 2 * 3 [2]
Comparison, string [ "$(command)" == "value" ] ${command} == "value" [2]
Comparison, numeric [ $integer -eq 5 ] $number == 5 [2]
Arithmetic echo $(( 1+2*3 )) 1 + 2 * 3 [2]

out ${1+2*3} [2]
Supported data types 1. String,
2. Integer
(all variables are strings)
1. String,
2. Integer,
3. Float (default number type),
4. Boolean
5. Array,
6. Object,
7. Null
(all variables can be treated as strings and/or their primitive)

Variables
Assign a local variable local foo="bar" foo = "bar" [2]

set str foo = "bar" [2]

out "bar" | set foo
Assign a global variable foo="bar" global str foo = "bar" [2]

out "bar" | global foo
Assign an environmental variable export foo="bar" export foo = "bar" [2] [3]

out "bar" | export foo [3]
Printing a variable echo "$foobar" out $foobar

$foobar

(variables don’t need to be quoted in murex)

Arrays
(eg arrays, lists)
Creating an array array_name=(value1 value2 value3) %[value1 value2 value3]

%[value1, value2, value3]

eg array_name = %[1, 2, 3],
eg %[hello world] | foreach { ... }
Accessing an array element ${array_name[0]} $array_name[0]

array | [0]
Printing multiple elements echo ${array_name[1]} ${array_name[0]} @array_name[1 0]

array | [1 0]
Printing a range of elements n/a @array_name[1..3]

array | [1..3]
Printing all elements echo ${array_name[*]} @array_name
Iterating through an array for item in array; do;
    $item
done;
array | foreach item { $item }

eg %[Tom Richard Sally] | foreach name { out "Hello $name" }

Objects
(eg JSON objects, maps, hashes, dictionaries)
Creating an object n/a %{ key: value, array: [1, 2, 3] } [2]

eg object_name = %{ key: val, arr: [1,3,3] }
eg %{ a:1, b:2, c:3 } | formap { ... }
Accessing an element n/a $object_name[key]

object | [key]
Printing multiple elements n/a $object_name[key1 key2]

object | [key1 key2]
Accessing a nested element n/a $object_name[.path.to.element]] [4]

object | [[.path.to.element]] [4]

Iterating through an map n/a object | formap key value { $key; $value }

eg %{Bob: {age: 10}, Richard: {age: 20}, Sally: {age: 30} } | formap name person { out "$name is $person[age] years old" }

Sub-shells
Sub-shell, string "$(commands)"

eg "echo $(echo "Hello world")"
${commands}

eg out ${out Hello world}
Sub-shell, arrays $(commands)

eg $(echo 1 2 3)
@{commands}

eg out @{ %[1,2,3] }

Footnotes

  1. Supported for compatibility with traditional shells like Bash.
  2. Unlike Bash, whitespace (or the absence of) is optional.
  3. Environmental variables can only be stored as a string. This is a limitation of current operating systems.
  4. Path separator can be any 1 byte wide character, eg /. The path separator is defined by the first character in a path.

See Also

This site's content is rebuilt automatically from murex's source code after each merge to the master branch. Downloadable murex binaries are also built with the website.

Last built on Mon Feb 13 09:18:06 UTC 2023 against commit f339958f33995895c1d997efcdbb8408d2c8d45f8b5f934.

Current version is which has been verified against 13950 tests cases.