Emacs, scripting and anything text oriented.

Writing aliases with optional arguments in tcsh

Kaushal Modi

Some times I would need to define an alias in tcsh which can have optional arguments. tcsh doesn’t seem to support that directly.

Here’s how I solve that problem.

If you have an alias alias test 'echo \!:1*' and if you run test abc def, you will get the output abc def.

!:1* prints out all the arguments starting from argument 1 till the last where even argument 1 is optional. If that argument doesn’t exist, the variable will be assigned a null value.

But tcsh will not complain about it – the * after !:1 is the beauty. On the other hand, if I have an alias alias test2 'echo \!:1', and if I run test – with zero arguments – tcsh will give an error.

So extending that, I have the below alias defined to grab an argument of any index.

alias opt_args 'set arg1 = `echo \!:1* | awk '"'"'{ print $1 }'"'"'`; \\
                echo -n "Arg num 1 = $arg1 "; \\
                set arg2 = `echo \!:2* | awk '"'"'{ print $1 }'"'"'`; \\
                echo -n "Arg num 2 = $arg2 "; \\
                set arg3 = `echo \!:3* | awk '"'"'{ print $1 }'"'"'`; \\
                echo -n "Arg num 3 = $arg3 "; \\
                echo ""; \\

You can test this alias by running these commands:

opt_args abc
opt_args abc def
opt_args abc def ghi
opt_args abc def ghi jkl

If you have written a response to this, enter your response post's URL below.

Or, you can send a "comment" webmention (it's OK if you don't know what that means). When asked about your website on an IndieAuth login screen, simply type https://commentpara.de.

Markdown Support**bold**, _italics_, ~~strikethrough~~, [descr](link), `monospace`, ```LANG\nline1\nline2\n``` (Yep, multi-line code blocks too, with syntax highlighting!), auto-hyperlinking.

Webmentions #