Why Sponsor Oils? | source | all docs for version 0.23.0 | all versions | oilshell.org
Oils Reference — Chapter YSH Command Language Keywords
This chapter describes new YSH keywords in the command language.
(in progress)
Binds a name to a YSH expression on the right, with a dynamic check to prevent mutation.
const c = 'mystr' # equivalent to readonly c=mystr
const pat = / digit+ / # an eggex, with no shell equivalent
If you try to re-declare or mutate the name, the shell will fail with a runtime
error. const
uses the same mechanism as the readonly
builtin.
Consts should only appear at the top-level, and can't appear within proc
or
func
.
Initializes a name to a YSH expression.
var s = 'mystr' # equivalent to declare s=mystr
var pat = / digit+ / # an eggex, with no shell equivalent
It's either global or scoped to the current function.
You can bind multiple variables:
var flag, i = parseArgs(spec, ARGV)
var x, y = 42, 43
You can omit the right-hand side:
var x, y # implicitly initialized to null
At the top-level, setvar creates or mutates a variable.
setvar gFoo = 'mutable'
Inside a func or proc, it mutates a local variable declared with var.
proc p {
var x = 42
setvar x = 43
}
You can mutate a List location:
setvar a[42] = 'foo'
Or a Dict location:
setvar d['key'] = 43
setvar d.key = 43 # same thing
You can use any of these these augmented assignment operators
+= -= *= /= **= //= %=
&= |= ^= <<= >>=
Examples:
setvar x += 2 # increment by 2
setvar a[42] *= 2 # multiply by 2
setvar d.flags |= 0b0010_000 # set a flag
Creates or mutates a global variable. Has the same syntax as setvar
.
The =
keyword evaluates an expression and shows the result:
oil$ = 1 + 2*3
(Int) 7
It's meant to be used interactively. Think of it as an assignment with no variable on the left.
The call
keyword evaluates an expression and throws away the result:
var x = :| one two |
call x->append('three')
call x->append(['typed', 'data'])
Procs are shell-like functions, but with named parameters, and without dynamic scope.
Here's a simple proc:
proc my-cp (src, dest) {
cp --verbose --verbose $src $dest
}
Here's the most general form:
proc p (
w1, w2, ...rest_words;
t1, t2, ...rest_typed;
n1, n2, ...rest_named;
block) {
= w1
= t1
= n1
= block
}
See the Guide to Procs and Funcs for details.
Compare with sh-func.
Define pure functions, in the style of Python and JavaScript:
func add(x, y) {
return (x + y)
}
echo $[add(3, 2)] # => 5
See the Guide to Procs and Funcs for details.
To return an expression, wrap it in ()
as usual:
func inc(x) {
return (x + 1)
}