As we roll out more tools, both internal and public, there has been a growing need for easy-to-maintain shell scripting and build automation. Build automation is complex enough without all the syntax burden - my favorite is to use PowerShell, but often it feels like wrestling with the tool itself. PowerShell is powerful, sure, but its depth often means hunting down syntax I know I've used a dozen times before. Bash has its quirks across platforms, and honestly I don't know good ways of using it outside MinGW, Git Bash, or WSL - none of which felt quite "right".
I wanted something lighter: a shell scripting tool that's easy to pick up, cross-platform, and hard to forget once you start using it.
So I made EasyShell (or just easy): a minimal shell scripting language implemented in C# that focuses on process automation with a very small set of concepts.
Motivation and Design
EasyShell is for "lazy" developers (like me) who just want to automate common tasks - calling .NET APIs, running external tools, handling simple logic - without a steep syntax curve or platform-specific headaches. It combines a shell-like one-command-per-line flow with strong typing and easy .NET interop. No advanced Bash-style wizardry; just straightforward scripting.
It could also serve as a nice companion alongside other tools in the long-term Divooka ecosystem.
Quick Taste of the Syntax
Files typically use the .easy extension, with syntax highlighting available via the VS Code extension.
Here's a small sample from the repo:
# Comments start with #
HANDLEVAR NOW System.DateTime.Now
# Instance method via CALL
STRINGVAR DATE (CALL $NOW ToString)
# Static .NET call with expression
STRINGVAR VALUE (System.String.Format "Current time: {0}" $DATE)
STRINGVAR PATH "C:/temp/greeting.txt"
System.IO.File.WriteAllText $PATH $VALUE
Variables are declared with their type (INTVAR, STRINGVAR, BOOLVAR, DOUBLEVAR, HANDLEVAR), names are case-insensitive, and everything lives in global scope for simplicity. Expressions are wrapped in parentheses for inline evaluation, like (== $X 10) or sub-commands.
Control flow sticks to the basics:
IF ... ELSEIF ... ELSE ... ENDWHILE ... END- Simple
FUNC ... END/CALL(globals make "returns" easy via variables)
You can call external executables naturally, and non-built-in commands fall through to process execution (stdout capture included).
Early Days
This is version 0.1.0 territory - functional for everyday build tasks, with room to grow (arithmetic helpers, more examples, etc.). You can run it in REPL mode (easy) or point it at a script. Builds and packages are straightforward with the included scripts.
If you've ever wished for something between a full PowerShell script and a quick batch file that "just works" across machines, maybe give EasyShell a try. The GitHub repo has the full language overview, examples, and build details: MethodoxTech/EasyShell.
Top comments (0)