pure-sh-bible/README.md
2019-09-19 11:42:19 +03:00

7.1 KiB

pure sh bible

A collection of pure POSIX sh alternatives to external processes

Table of Contents

STRINGS

Strip pattern from start of string

Example Function:

lstrip() {
    # Usage: lstrip "string" "pattern"
    printf '%s\n' "${1##$2}"
}

Example Usage:

$ lstrip "The Quick Brown Fox" "The "
Quick Brown Fox

Strip pattern from end of string

Example Function:

rstrip() {
    # Usage: rstrip "string" "pattern"
    printf '%s\n' "${1%%$2}"
}

Example Usage:

$ rstrip "The Quick Brown Fox" " Fox"
The Quick Brown

Trim all white-space from string and truncate spaces

This is an alternative to sed, awk, perl and other tools. The function below works by abusing word splitting to create a new string without leading/trailing white-space and with truncated spaces.

Example Function:

# shellcheck disable=SC2086,SC2048
trim_all() {
    # Usage: trim_all "   example   string    "
    set -f
    set -- $*
    printf '%s\n' "$*"
    set +f
}

Example Usage:

$ trim_all "    Hello,    World    "
Hello, World

$ name="   John   Black  is     my    name.    "
$ trim_all "$name"
John Black is my name.

Check if string contains a sub-string

Using a case statement:

case $var in
    *sub_string*)
        # Do stuff
    ;;

    *sub_string2*)
        # Do more stuff
    ;;

    *)
        # Else
    ;;
esac

Check if string starts with sub-string

Using a case statement:

case $var in
    sub_string*)
        # Do stuff
    ;;

    sub_string2*)
        # Do more stuff
    ;;

    *)
        # Else
    ;;
esac

Check if string ends with sub-string

Using a case statement:

case $var in
    *sub_string)
        # Do stuff
    ;;

    *sub_string2)
        # Do more stuff
    ;;

    *)
        # Else
    ;;
esac

FILES

Get the first N lines of a file

Alternative to the head command.

Example Function:

head() {
    # Usage: head "n" "file"
    while read -r line; do
        [ "$i" = "$1" ] && break
        printf '%s\n' "$line"
        i=$((i+1))
    done < "$2"
}

Example Usage:

$ head 2 ~/.bashrc
# Prompt
PS1='➜ '

$ head 1 ~/.bashrc
# Prompt

Get the number of lines in a file

Alternative to wc -l.

Example Function:

lines() {
    # Usage: lines "file"
    while read -r _; do
        lines=$((lines+1))
    done < "$1"

    printf '%s\n' "$lines"
}

Example Usage:

$ lines ~/.bashrc
48

Count files or directories in directory

This works by passing the output of the glob to the function and then counting the number of arguments.

Example Function:

count() {
    # Usage: count /path/to/dir/*
    #        count /path/to/dir/*/
    printf '%s\n' "$#"
}

Example Usage:

# Count all files in dir.
$ count ~/Downloads/*
232

# Count all dirs in dir.
$ count ~/Downloads/*/
45

# Count all jpg files in dir.
$ count ~/Pictures/*.jpg
64

Create an empty file

Alternative to touch.

:>file

# OR (shellcheck warns for this)
>file

FILE PATHS

Get the directory name of a file path

Alternative to the dirname command.

Example Function:

dirname() {
    # Usage: dirname "path"
    printf '%s\n' "${1%/*}/"
}

Example Usage:

$ dirname ~/Pictures/Wallpapers/1.jpg
/home/black/Pictures/Wallpapers/

$ dirname ~/Pictures/Downloads/
/home/black/Pictures/

Get the base-name of a file path

Alternative to the basename command.

Example Function:

basename() {
    # Usage: basename "path"
    path=${1%/}
    printf '%s\n' "${path##*/}"
}

Example Usage:

$ basename ~/Pictures/Wallpapers/1.jpg
1.jpg

$ basename ~/Pictures/Downloads/
Downloads

ESCAPE SEQUENCES

Contrary to popular belief, there is no issue in utilizing raw escape sequences. Using tput abstracts the same ANSI sequences as if printed manually. Worse still, tput is not actually portable. There are a number of tput variants each with different commands and syntaxes (try tput setaf 3 on a FreeBSD system). Raw sequences are fine.

Text Colors

NOTE: Sequences requiring RGB values only work in True-Color Terminal Emulators.

Sequence What does it do? Value
\e[38;5;<NUM>m Set text foreground color. 0-255
\e[48;5;<NUM>m Set text background color. 0-255
\e[38;2;<R>;<G>;<B>m Set text foreground color to RGB color. R, G, B
\e[48;2;<R>;<G>;<B>m Set text background color to RGB color. R, G, B

Text Attributes

Sequence What does it do?
\e[m Reset text formatting and colors.
\e[1m Bold text.
\e[2m Faint text.
\e[3m Italic text.
\e[4m Underline text.
\e[5m Slow blink.
\e[7m Swap foreground and background colors.

Cursor Movement

Sequence What does it do? Value
\e[<LINE>;<COLUMN>H Move cursor to absolute position. line, column
\e[H Move cursor to home position (0,0).
\e[<NUM>A Move cursor up N lines. num
\e[<NUM>B Move cursor down N lines. num
\e[<NUM>C Move cursor right N columns. num
\e[<NUM>D Move cursor left N columns. num
\e[s Save cursor position.
\e[u Restore cursor position.

Erasing Text

Sequence What does it do?
\e[K Erase from cursor position to end of line.
\e[1K Erase from cursor position to start of line.
\e[2K Erase the entire current line.
\e[J Erase from the current line to the bottom of the screen.
\e[1J Erase from the current line to the top of the screen.
\e[2J Clear the screen.
\e[2J\e[H Clear the screen and move cursor to 0,0.