pure-bash-bible/README.md

172 lines
3.8 KiB
Markdown
Raw Normal View History

2018-06-13 04:04:46 +02:00
<h1 align="center">pure bash</h1> <p align="center">A [WIP] collection of
pure bash alternatives to external processes.</p>
2018-06-13 03:51:15 +02:00
2018-06-13 04:04:46 +02:00
The goal of this repository is to document known and unknown methods of
doing various tasks using only built-in bash features. Using the snippets
from this guide can help to remove unneeded dependencies from your scripts
and in most cases make them that little bit faster. I came across these
tips and discovered a few while developing
[neofetch](https://github.com/dylanaraps/neofetch),
[pxltrm](https://github.com/dylanaraps/pxltrm) and some other smaller
projects.
This repository is open to contribution. If you see something that is
incorrectly described, buggy or outright wrong, open an issue or send a
pull request. If you know a handy snippet that is not included in this
list, send a pull request!
2018-06-13 04:39:10 +02:00
**NOTE**: Error handling (*checking if a file exists, etc*) is not
included. These are meant to be snippets you can incorporate into your
scripts and not full blown utilities.
2018-06-13 04:04:46 +02:00
## Table of Contents
2018-06-13 03:43:02 +02:00
<!-- vim-markdown-toc GFM -->
2018-06-13 04:35:53 +02:00
* [File handling](#file-handling)
2018-06-13 04:37:07 +02:00
* [Get the first N lines of a file.](#get-the-first-n-lines-of-a-file)
* [Get the last N lines of a file.](#get-the-last-n-lines-of-a-file)
2018-06-13 04:35:53 +02:00
* [Get the number of lines in a file.](#get-the-number-of-lines-in-a-file)
* [Strings](#strings)
* [Get the directory name of a file path.](#get-the-directory-name-of-a-file-path)
* [Trim quotes from a string.](#trim-quotes-from-a-string)
* [Colors](#colors)
2018-06-13 04:37:07 +02:00
* [Convert a hex color to RGB.](#convert-a-hex-color-to-rgb)
2018-06-13 04:35:53 +02:00
* [Convert an RGB color to hex.](#convert-an-rgb-color-to-hex)
* [Miscellaneous](#miscellaneous)
* [Getting the terminal size (*in a script*).](#getting-the-terminal-size-in-a-script)
* [Get the current date using `strftime`.](#get-the-current-date-using-strftime)
2018-06-13 03:43:02 +02:00
<!-- vim-markdown-toc -->
2018-06-13 03:39:17 +02:00
2018-06-13 04:35:53 +02:00
## File handling
2018-06-13 03:39:17 +02:00
2018-06-13 04:37:07 +02:00
### Get the first N lines of a file.
2018-06-13 04:22:42 +02:00
Alternative to the `head` command.
**NOTE:** Requires `bash` 4+
```sh
head() {
# Usage: head "n" "file"
mapfile -tn "$1" line < "$2"
printf '%s\n' "${line[@]}"
}
```
2018-06-13 04:37:07 +02:00
### Get the last N lines of a file.
2018-06-13 04:22:42 +02:00
Alternative to the `tail` command.
**NOTE:** Requires `bash` 4+
```sh
tail() {
# Usage: tail "n" "file"
mapfile -tn 0 line < "$2"
printf '%s\n' "${line[@]: -$1}"
}
```
2018-06-13 04:35:53 +02:00
### Get the number of lines in a file.
2018-06-13 04:31:24 +02:00
Alternative to `wc -l`.
**NOTE:** Requires `bash` 4+
```sh
lines() {
# Usage lines "file"
mapfile -tn 0 lines < "$1"
printf '%s\n' "${#lines[@]}"
}
```
2018-06-13 04:35:53 +02:00
## Strings
### Get the directory name of a file path.
2018-06-13 03:39:17 +02:00
2018-06-13 04:04:46 +02:00
Alternative to the `dirname` command.
2018-06-13 03:39:17 +02:00
2018-06-13 03:42:18 +02:00
```sh
2018-06-13 03:39:17 +02:00
dirname() {
# Usage: dirname "path"
2018-06-13 04:07:54 +02:00
printf '%s\n' "${1%/*}/"
2018-06-13 03:39:17 +02:00
}
```
2018-06-13 04:35:53 +02:00
### Trim quotes from a string.
```sh
trim_quotes() {
# Usage: trim_quotes "string"
: "${1//\'}"
printf "%s\\n" "${_//\"}"
}
```
## Colors
2018-06-13 04:37:07 +02:00
### Convert a hex color to RGB.
2018-06-13 04:04:46 +02:00
```sh
hex_to_rgb() {
# Usage: hex_to_rgb "#FFFFFF"
((r=16#${1:1:2}))
((g=16#${1:3:2}))
((b=16#${1:5:6}))
printf '%s\n' "$r $g $b"
}
```
2018-06-13 04:35:53 +02:00
### Convert an RGB color to hex.
2018-06-13 04:04:46 +02:00
```sh
rgb_to_hex() {
# Usage: rgb_to_hex "r" "g" "b"
printf '#%02x%02x%02x\n' "$1" "$2" "$3"
}
```
2018-06-13 04:35:53 +02:00
## Miscellaneous
### Getting the terminal size (*in a script*).
This is handy when writing scripts in pure bash and `stty`/`tput` cant be
called.
2018-06-13 03:39:17 +02:00
2018-06-13 04:21:50 +02:00
```sh
2018-06-13 04:35:53 +02:00
get_term_size() {
# Usage: get_term_size
# (:;:) is a micro sleep to ensure the variables are
# exported immediately.
shopt -s checkwinsize; (:;:)
printf '%s\n' "$LINES $COLUMNS"
}
```
### Get the current date using `strftime`.
Bashs `printf` has a built-in method of getting the date which we can use
in place of the `date` command in a lot of cases.
**NOTE:** Requires `bash` 4+
```sh
date() {
# Usage: date "format"
# See: 'man strftime' for format.
printf "%($1)T\\n"
2018-06-13 04:21:50 +02:00
}
```
2018-06-13 04:35:53 +02:00