You can call this command either without the parameter or with a value to override the default value:
```nu
greet
# => Hello, Nushell!
greet world
# => Hello, World!
```
You can also combine a default value with a [type annotation](#parameter-types):
```nu
def congratulate [age: int = 18] {
$"Happy birthday! You are ($age) years old now!"
}
```
### Parameter Types
For each parameter, you can optionally define its type. For example, you can write the basic `greet` command as:
```nu
def greet [name: string] {
$"Hello, ($name)"
}
```
If a parameter is not type-annotated, Nushell will treat it as an [`any` type](./types_of_data.html#any). If you annotate a type on a parameter, Nushell will check its type when you call the function.
For example, let's say you wanted to only accept an `int` instead of a `string`:
```nu
def greet [name: int] {
$"hello ($name)"
}
greet World
```
If we try to run the above, Nushell will tell us that the types don't match:
```nu
Error: nu::parser::parse_mismatch
× Parse mismatch during operation.
╭─[entry #1:1:7]
1 │ greet World
· ──┬──
· ╰── expected int
╰────
```
::: tip Cool!
Type checks are a parser feature. When entering a custom command at the command-line, the Nushell parser can even detect invalid argument types in real-time and highlight them before executing the command.
The highlight style can be changed using a [theme](https://github.com/nushell/nu_scripts/tree/main/themes) or manually using `$env.config.color_config.shape_garbage`.
:::
::: details List of Type Annotations
Most types can be used as type-annotations. In addition, there are a few "shapes" which can be used. For instance:
- `number`: Accepts either an `int` or a `float`
- `path`: A string where the `~` and `.` characters have special meaning and will automatically be expanded to the full-path equivalent. See [Path](/lang-guide/chapters/types/other_types/path.html) in the Language Reference Guide for example usage.
- `directory`: A subset of `path` (above). Only directories will be offered when using tab-completion for the parameter. Expansions take place just as with `path`.
- `error`: Available, but currently no known valid usage. See [Error](/lang-guide/chapters/types/other_types/error.html) in the Language Reference Guide for more information.
The following [types](./types_of_data.html) can be used for parameter annotations:
- `any`
- `binary`
- `bool`
- `cell-path`
- `closure`
- `datetime`
- `duration`
- `filesize`
- `float`
- `glob`
- `int`
- `list`
- `nothing`
- `range`
- `record`
- `string`
- `table`
:::
### Flags
In addition to positional parameters, you can also define named flags.
For example:
```nu
def greet [
name: string
--age: int
] {
{
name: $name
age: $age
}
}
```
In this version of `greet`, we define the `name` positional parameter as well as an `age` flag. The positional parameter (since it doesn't have a `?`) is required. The named flag is optional. Calling the command without the `--age` flag will set `$age` to `null`.
The `--age` flag can go before or after the positional `name`. Examples:
```nu
greet Lucia --age 23
# => ╭──────┬───────╮
# => │ name │ Lucia │
# => │ age │ 23 │
# => ╰──────┴───────╯
greet --age 39 Ali
# => ╭──────┬─────╮
# => │ name │ Ali │
# => │ age │ 39 │
# => ╰──────┴─────╯
greet World
# => ╭──────┬───────╮
# => │ name │ World │
# => │ age │ │
# => ╰──────┴───────╯
```
Flags can also be defined with a shorthand version. This allows you to pass a simpler flag as well as a longhand, easier-to-read flag.
Let's extend the previous example to use a shorthand flag for the `age` value:
```nu
def greet [
name: string
--age (-a): int
] {
{
name: $name
age: $age
}
}
```
::: tip
The resulting variable is always based on the long flag name. In the above example, the variable continues to be `$age`. `$a` would not be valid.
:::
Now, we can call this updated definition using the shorthand flag: