152 lines
2.4 KiB
Plaintext
152 lines
2.4 KiB
Plaintext
|
# Conversion
|
|||
|
|
|||
|
## Convert a hex color to RGB
|
|||
|
|
|||
|
**Example Function:**
|
|||
|
|
|||
|
```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"
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
**Example Usage:**
|
|||
|
|
|||
|
```shell
|
|||
|
$ hex_to_rgb "#FFFFFF"
|
|||
|
255 255 255
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
## Convert an RGB color to hex
|
|||
|
|
|||
|
**Example Function:**
|
|||
|
|
|||
|
```sh
|
|||
|
rgb_to_hex() {
|
|||
|
# Usage: rgb_to_hex "r" "g" "b"
|
|||
|
printf '#%02x%02x%02x\n' "$1" "$2" "$3"
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
**Example Usage:**
|
|||
|
|
|||
|
```shell
|
|||
|
$ rgb_to_hex "255" "255" "255"
|
|||
|
#FFFFFF
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
# Code Golf
|
|||
|
|
|||
|
## Shorter `for` loop syntax
|
|||
|
|
|||
|
```shell
|
|||
|
# Tiny C Style.
|
|||
|
for((;i++<10;)){ echo "$i";}
|
|||
|
|
|||
|
# Undocumented method.
|
|||
|
for i in {1..10};{ echo "$i";}
|
|||
|
|
|||
|
# Expansion.
|
|||
|
for i in {1..10}; do echo "$i"; done
|
|||
|
|
|||
|
# C Style.
|
|||
|
for((i=0;i<=10;i++)); do echo "$i"; done
|
|||
|
```
|
|||
|
|
|||
|
## Shorter infinite loops
|
|||
|
|
|||
|
```shell
|
|||
|
# Normal method
|
|||
|
while :; do echo hi; done
|
|||
|
|
|||
|
# Shorter
|
|||
|
for((;;)){ echo hi;}
|
|||
|
```
|
|||
|
|
|||
|
## Shorter function declaration
|
|||
|
|
|||
|
```shell
|
|||
|
# Normal method
|
|||
|
f(){ echo hi;}
|
|||
|
|
|||
|
# Using a subshell
|
|||
|
f()(echo hi)
|
|||
|
|
|||
|
# Using arithmetic
|
|||
|
# You can use this to assign integer values.
|
|||
|
# Example: f a=1
|
|||
|
# f a++
|
|||
|
f()(($1))
|
|||
|
|
|||
|
# Using tests, loops etc.
|
|||
|
# NOTE: You can also use ‘while’, ‘until’, ‘case’, ‘(())’, ‘[[]]’.
|
|||
|
f()if true; then echo "$1"; fi
|
|||
|
f()for i in "$@"; do echo "$i"; done
|
|||
|
```
|
|||
|
|
|||
|
## Shorter `if` syntax
|
|||
|
|
|||
|
```shell
|
|||
|
# One line
|
|||
|
# Note: The 3rd statement may run when the 1st is true
|
|||
|
[[ "$var" == hello ]] && echo hi || echo bye
|
|||
|
[[ "$var" == hello ]] && { echo hi; echo there; } || echo bye
|
|||
|
|
|||
|
# Multi line (no else, single statement)
|
|||
|
# Note: The exit status may not be the same as with an if statement
|
|||
|
[[ "$var" == hello ]] && \
|
|||
|
echo hi
|
|||
|
|
|||
|
# Multi line (no else)
|
|||
|
[[ "$var" == hello ]] && {
|
|||
|
echo hi
|
|||
|
# ...
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## Simpler `case` statement to set variable
|
|||
|
|
|||
|
We can use the `:` builtin to avoid repeating `variable=` in a case
|
|||
|
statement. The `$_` variable stores the last argument of the last
|
|||
|
successful command. `:` always succeeds so we can abuse it to store the
|
|||
|
variable value.
|
|||
|
|
|||
|
```shell
|
|||
|
# Modified snippet from Neofetch.
|
|||
|
case "$OSTYPE" in
|
|||
|
"darwin"*)
|
|||
|
: "MacOS"
|
|||
|
;;
|
|||
|
|
|||
|
"linux"*)
|
|||
|
: "Linux"
|
|||
|
;;
|
|||
|
|
|||
|
*"bsd"* | "dragonfly" | "bitrig")
|
|||
|
: "BSD"
|
|||
|
;;
|
|||
|
|
|||
|
"cygwin" | "msys" | "win32")
|
|||
|
: "Windows"
|
|||
|
;;
|
|||
|
|
|||
|
*)
|
|||
|
printf '%s\n' "Unknown OS detected, aborting..." >&2
|
|||
|
exit 1
|
|||
|
;;
|
|||
|
esac
|
|||
|
|
|||
|
# Finally, set the variable.
|
|||
|
os="$_"
|
|||
|
```
|
|||
|
|
|||
|
<!-- CHAPTER END -->
|
|||
|
|