-
Michael Aaron Murphy authoredMichael Aaron Murphy authored
- Ion Shell
- Shell Syntax
- Defining Variables
- Dropping Variables
- Variable Arithmetic
- Export
- Export Arithmetic
- Aliases
- Commands
- Piping & Redirecting Standard Output
- Piping & Redirecting Standard Error
- Piping & Redirecting Both Standard Output & Standard Error
- Conditional Operators
- If Conditions
- While Loops
- For Loops
- Functions
- Brace Expansion
Ion Shell
Ion is the underlying library for shells and command execution in Redox, as well as the default shell.
Shell Syntax
Defining Variables
The let
keyword is utilized to create local variables within the shell. The export
keyword performs
a similar action, only setting the variable globally as an environment variable for the operating system.
let git_branch = $(git rev-parse --abbrev-ref HEAD ^> /dev/null)
If the command is executed without any arguments, it will simply list all available variables.
Dropping Variables
To drop a value from the shell, the drop
keyword may be used:
drop git_branch
Variable Arithmetic
The let
command also supports basic arithmetic.
let a = 1
echo $a
let a += 4
echo $a
let a *= 10
echo $a
let a /= 2
echo $a
let a -= 5
echo $a
Export
The export
command works similarly to the let
command, but instead of defining a local variable, it defines a global variable that other processes can access.
export PATH = "~/.cargo/bin:${PATH}"
Export Arithmetic
The export
command also supports basic arithmetic.
export a = 1
echo $a
export a += 4
echo $a
export a *= 10
echo $a
export a /= 2
echo $a
export a -= 5
echo $a
Aliases
The alias
command is used to set an alias for running other commands under a different name. The most common usages of the alias
keyword are to shorten the keystrokes required to run a command and it's specific arguments, and to rename a command to something more familiar.
alias ls = 'exa'
If the command is executed without any arguments, it will simply list all available aliases.
The unalias
command performs the reverse of alias
in that it drops the value from existence.
unalias ls
Commands
Commands may be written line by line or altogether on the same line with semicolons separating them.
command arg1 arg2 arg3
command arg1 arg2 arg3
command arg1 arg2 arg3; command arg1 arg2 arg3; command arg1 arg2 arg3
Piping & Redirecting Standard Output
The pipe (|
) and redirect (>
) operators are used for manipulating the standard output.
command arg1 | other_command | another_command arg2
command arg1 > file
Piping & Redirecting Standard Error
The ^|
and ^>
operators are used for manipulating the standard error.
command arg1 ^| other_command # Not supported yet
command arg1 ^> file
Piping & Redirecting Both Standard Output & Standard Error
The &|
and &>
operators are used for manipulating both the standard output and error.
command arg1 &| other_command # Not supported yet
command arg1 &> file
Conditional Operators
The Ion shell supports the &&
and ||
operators in the same manner as the Bash shell. The &&
operator
executes the following command if the previous command exited with a successful exit status. The ||
operator performs the reverse -- executing if the previous command exited in failure.
test -e .git && echo Git directory exists || echo Git directory does not exist
If Conditions
It is also possible to perform more advanced conditional expressions using the if
, else if
, and else
keywords.
let a = 5;
if test $a -lt 5
echo "a < 5"
else if test $a -eq 5
echo "a == 5"
else
echo "a > 5"
end
While Loops
While loops will evaluate a supplied expression for each iteration and execute all the contained statements if it evaluates to a successful exit status.
let a = 1
while test $a -lt 100
echo $a
let a += 1
end
For Loops
For loops, on the other hand, will take a variable followed by a list of values or a range expression, and
iterate through all contained statements until all values have been exhausted. If the variable is _
, it
will be ignored.
# Obtaining Values From a Subshell
for a in $(seq 1 10)
echo $a
end
# Values Provided Directly
for a in 1 2 3 4 5
echo $a
end
# Exclusive Range
for a in 1..11
echo $a
end
# Inclusive Range
for a in 1...10
echo $a
end
# Ignore Value
for _ in 1..10
do_something
end
Functions
Functions in the Ion shell are defined with a name along with a set of variables. The function will check if the corrent number of arguments were supplied and execute if all arguments were given.
fn fib n
if test $n -le 1
echo $n
else
let output = 1
let previous = 1
for _ in 2..$n
let temp = $output
let output += $previous
let previous = $temp
end
echo $output
end
end
for i in 1..20
fib $i
end
Brace Expansion
It is possible to perform brace expansions within the Ion shell. Currently, only permutation braces are supported.
echo abc{1,2,3}def{456,789,101112}