Skip to content

Functions ​

Functions are a way to group commands for later execution using a single name for the group. They are executed just like a "regular" command. When the name of a function is used as a simple command name, the list of commands associated with that function name is executed. Functions are executed in the current shell context.

Declaring functions ​

You can declare a function like this:

sh
function functionName() {
	# commands
}

The parentheses are optional, the above example can be refactored to:

sh
function functionName {
	# commands
}

Even the function keyword is optional, and can be omited, in this case, the parentheses () are required, the above examples can be refactored to:

sh
functionName() {
	# commands
}

Declaring redirections ​

When you declare a function in any of the possible forms, you may apply redirections on the function declaration. when you do, those redirections will be applied on the commands within the function each time the function in invoked.

for example:

sh
function functionName() {
	# commands
} >output.txt <input.txt

Invoking functions ​

Functions can invoked just like any other simple command, you just call a command using the function name, this means that all rules that apply to simple commands like arguments, environment variables and redirections will be applied to the function.

sh
function functionName() {
	echo $env_var $1 $2
}

env_var=foo functionName bar baz

# Output: fo bar baz

Isolated functions ​

Because functions are executed in current context. variables declared or mutated within functions affect the global scope.

for example:

sh
var=foo

function functionName() {
	var=bar
}

echo $var

functionName

echo $var

Outputs:

txt
foo
bar

You can declare a function to run in a subshell by replacing the braces {} by parentheses ():

sh
var=foo

function functionName() (
	var=bar
)


echo $var

functionName

echo $var

Outputs:

txt
foo
foo

Return from function ​

the return keyword is used to return from a function.

for example:

sh
function foo(){
	echo foo

	return

	echo bar
}

foo

Outputs:

txt
foo

an optional argument specifies the return status.

sh
function foo(){
	# ...
	return 3
	# ...
}

foo

This function exits with 3 exit code.

Flags ​

Bunster has builtin flags parsing capability. it's part of the function declaration.

for example:

sh
function myFunc( -a -b -c ){
	echo -a = $fflags_a
	echo -b = $fflags_b
	echo -c = $fflags_c
}

myFunc -a -c

Outputs:

txt
-a = 1
-b = 0
-c = 1

You declare the flags within the parentheses in function declaration, and when the function is called, bunster will parse them and make them available as local variables prefixed with fflags_. for example, in above example, we declared three boolean flags -a, -b and -c, and they became available as $fflags_a, $fflags_b and $fflags_c variables.

Short boolean flags ​

short boolean flags are one character long flags that don't accept a value, they're assigned 1 when they're supplied. and 0 otherwise.

example:

sh
function myFunc( -a -b -c ){
	echo -a = $fflags_a, -b = $fflags_b, -c = $fflags_c
}

myFunc -a -c
myFunc -c -b
myFunc -a

Outputs:

txt
-a = 1, -b = 0, -c = 1
-a = 0, -b = 1, -c = 1
-a = 1, -b = 0, -c = 0

Short string flags ​

short string flags are one character long flags that accept a value. example:

sh
function myFunc( -a= -b= -c= ){
	echo -a = $fflags_a, -b = $fflags_b, -c = $fflags_c
}

myFunc -a avalue -b bvalue -c cvalue

Outputs:

txt
-a = avalue, -b = bvalue, -c = cvalue

Short flags grouping ​

short flags can be grouped together when supplied. for example:

sh
function myFunc( -a -b= -c= ){
	echo -a = $fflags_a, -b = $fflags_b, -c = $fflags_c
}

myFunc -acb cvalue bvalue

Outputs:

txt
-a = 1, -b = bvalue, -c = cvalue

Long boolean flags ​

long boolean flags are sometimes called options, they're usually a word or more long, that don't accept a value, they're assigned 1 when they're supplied. and 0 otherwise.

example:

sh
function myFunc( --foo --bar --baz ){
	echo --foo = $fflags_foo, --bar = $fflags_bar, --baz = $fflags_baz
}

myFunc --foo --bar
myFunc --bar --baz

Outputs:

txt
--foo = 1, --bar = 1, --baz = 0
--foo = 0, --bar = 1, --baz = 1

Long string flags ​

long string flags are just long boolean flags,but they accept a value. example:

sh
function myFunc( --foo= --bar= --baz= ){
	echo --foo = $fflags_foo, --bar = $fflags_bar, --baz = $fflags_baz
}

myFunc --foo fooValue --bar barValue --baz bazValue

Outputs:

txt
--foo = fooValue, --bar = barValue, --baz = bazValue

Optional flags ​

All boolean flags are optional by default, their value is 0 unless they're supplied. However, all string flags short or long are required by default. an error occurs if they're not supplied.

You can mark a flag as optional using the [=] instead of = in declaration. optional flags are not set if not supplied.

sh
function myFunc( -a[=] --foo[=] ){
	echo -a = $fflags_a, --foo = $fflags_foo
}

myFunc --foo fooValue -a avalue
myFunc --foo fooValue
myFunc -a avalue
myFunc

Outputs:

txt
-a = avalue, --foo = fooValue
-a = , --foo = fooValue
-a = avalue, --foo =
-a = , --foo =

Arguments after flag parsing ​

The arguments that are not flags or arguments to flags are kept available as positional variables to that function.

for example:

sh
function myFunc( -a[=] --foo[=] ){
	echo -a = $fflags_a, --foo = $fflags_foo
	echo arguments = [$@]
}

myFunc arg --foo fooValue arg -a avalue arg

Outputs:

txt
-a = avalue, --foo = fooValue
arguments = [arg arg arg]

Terminating flags parsing (--) ​

by default, an error occurs when passing a flag that is not declared. for example:

sh
function myFunc( -a --boo ){
	return;
}

myFunc -x

# myFunc: unknown short flag: x

Sometimes, you want to pass an argument that starts with a dash -, but you don't want bunster to treat it as a flag. you can use the -- to terminate flags parsing. all arguments that come after the -- are treated literally as arguments.

for example:

sh
function myFunc( -a --boo ){
	echo arguments = [$@]
}

myFunc arg -- -x --foo -abc

Outputs:

txt
arguments = [arg -x --foo -abc]

Released under the 3-Clause BSD License.