"Can it be simpler?" - A recurring thought I've had while working on build automation.
EasyShell (command: easy) is a minimal shell scripting language designed from the ground up for simplicity and cross-platform build/process automation. If you’ve ever felt that PowerShell’s syntax is powerful but easy to forget, or that traditional shell scripts get messy across operating systems, EasyShell aims to strike a cleaner balance.
It's implemented in C# and runs on .NET, giving you natural access to the entire .NET ecosystem while keeping the scripting experience lightweight and approachable.
Design Principles
- One command per line (shell-like flow)
- Very small set of core concepts
- Strongly-typed global variables
- Seamless .NET interop via reflection
- Expressions in parentheses for inline evaluation
- Easy to read, write, and remember
Version 0.1.0 is now available — functional for everyday automation tasks.
Core Language Features
Variables
All variables are declared with an explicit type and live in global scope:
INTVAR Count 42
BOOLVAR Debug TRUE
DOUBLEVAR Ratio 3.14
STRINGVAR Message "Hello from EasyShell"
HANDLEVAR Now System.DateTime.Now # stores object instances
- Variable names are case-insensitive
- Reference with
$VarName - Re-assign with
$VarName = value(or expressions)
Expressions (The Power Feature)
Wrap sub-commands in parentheses to evaluate them inline:
STRINGVAR Formatted (System.String.Format "Count = {0}" $Count)
BOOLVAR IsBig (> $Count 100)
STRINGVAR Today (format "{0:yyyy-MM-dd}" (GetDate))
Calling .NET
- Static members (fully qualified):
System.Console.WriteLine "Hello World!"
System.IO.File.WriteAllText "output.txt" $Message
- Instance methods via HANDLE:
HANDLEVAR Now System.DateTime.Now
STRINGVAR Stamp (CALL $Now ToString)
Control Flow
IF (== $Count 42)
print "The answer!"
ELSEIF (> $Count 50)
print "Too high"
ELSE
print "Something else"
END
INTVAR I 0
WHILE (< $I 5)
System.Console.WriteLine $I
$I = (+ $I 1) # arithmetic helpers coming soon
END
Functions
Simple named blocks (no parameters — use globals):
FUNC BuildProject
print "Building..."
dotnet build
END
CALL BuildProject
External Commands
Any command that isn’t a keyword or .NET call falls back to executing an external process (with stdout capture):
git status
dotnet publish ...
Real-World Example
Check out the full build script used by the project itself:
BuildEasyShell.easy
It demonstrates:
- Path handling and folder creation
- Running
dotnet publish - Conditional logic for OS/architecture
- Creating a dated zip package
This script is self-contained and shows how EasyShell can manage non-trivial automation tasks.
Quick Start
# REPL mode
easy
# Run a script
easy path/to/script.easy
# Help
easy --help
A dedicated VS Code syntax highlighting extension is available: Methodox.easyshell
Who Is It For?
EasyShell is ideal for:
- Build automation scripts
- Simple CI/CD glue
- Daily developer tooling
- Anyone who wants .NET power without heavy dependency
It's intentionally minimal — no advanced Bash-style features, just the essentials done in a way that’s hard to forget.
Give it a try and let me know what you think!
Top comments (0)