Unleashing One-Liner Power in Bash

By: w1ldc4rd-w1z4rd
[ BACK... ]

Perl one-liners are a powerful tool in a programmer’s arsenal, allowing for quick text processing and system administration tasks. But who says they have to be limited to a single line? Today, we’re going to explore how we can leverage the power of Perl one-liners within bash scripts, breaking free from the constraints of a single line while retaining all the benefits.

The Power of Perl in Bash Scripts

Let’s look at an example that demonstrates how we can use a Perl “one-liner” in a bash script, spanning multiple lines and leveraging the full power of Perl:

#!/bin/bash

# Define our multi-line Perl "one-liner"
read -r -d '' CMDS <<'CMDS'
# Debian Basics Installer
sudo apt install -y build-essential
sudo apt install -y make
sudo apt install -y neofetch
sudo apt install -y perl
sudo apt install -y cpanminus

# Perl Module Installer
sudo cpanm Tcl
sudo cpanm HTTP::Request::Common
sudo cpanm LWP::UserAgent
sudo cpanm JSON::XS
sudo cpanm Regexp::Grammars

# More system commands
sudo apt install -y ufw
sudo apt install -y vim
sudo apt install -y git
CMDS

# Execute our Perl "one-liner"
echo $CMDS | perl -MTerm::ANSIColor=':constants' -nlE '
    chomp;
    unless ( m~^$|^\#~ ) {
        say BOLD GREEN qq|> $_|, RESET;
        system $_;
        unless ($? == 0) {
            die BOLD RED qq|> Fail: $?\n|, RESET;
        }
    }
'

Breaking Down the Perl One-Liner

Let’s examine what’s happening in our Perl script:

  1. -MTerm::ANSIColor=‘:constants’: This loads the Term::ANSIColor module and imports its color constants, allowing us to add color to our output.

  2. -n: This creates an implicit while loop that reads input line by line.

  3. -l: This adds automatic line-ending processing, chomping input lines and adding newlines to print statements.

  4. -E: This enables all optional features and warnings, allowing us to use modern Perl syntax.

Inside the script:

# Removes the newline from the end of each input line.
chomp;

# Skips empty lines or lines starting with #.
unless ( m~^$|^\#~ )

# Prints each command in bold green.
say BOLD GREEN qq|> $_|, RESET;

# Executes the command.
system $_;

# Checks if the command failed (non-zero exit status).
unless ($? == 0)

# If the command failed, prints an error in bold red and exits the script.
die BOLD RED qq|> Fail: $?\n|, RESET;

Benefits of This Approach

  1. Concise yet powerful: Our Perl script is compact but capable of executing a series of commands with error checking and colorful output.

  2. Flexible input: By using a heredoc (CMDS), we can easily modify the list of commands to be executed.

  3. Error handling: Each command is checked for successful execution, with clear error reporting.

  4. Visual feedback: The use of colored output makes it easy to follow the script’s progress.

  5. Mixing package managers: We can seamlessly mix system package installation (apt) with Perl module installation (cpanm).

Conclusion

This approach demonstrates the flexibility of Perl in system administration tasks. By combining Bash’s ability to define multi-line strings with Perl’s powerful text processing and system interaction capabilities, we create a robust and flexible tool for executing a series of commands.

The real power here lies in the ability to treat our list of commands as data, which Perl then processes. This allows us to easily modify, extend, or generate the list of commands dynamically if needed, while still benefiting from Perl’s error handling and output formatting capabilities.

Remember, mastering Perl isn’t just about knowing the syntax—it’s about creatively applying the language to solve real-world problems efficiently. Happy coding!

Copyright ©️ 2024 perl.gg