As part of my continuing “Bash Fun” series, I have a few more tricks for Terminal junkies. These work in Bash and Zsh, and probably elsewhere.
To use any of these, just put them in a file and source them from your login profile (~/.bash_profile, etc.).
Write a quick Markdown list
This first one is super simple. It just takes a tab-indented list from STDIN and outputs a Markdown bullet list in Terminal. It removes blank lines and maintains indentation using sed.
You can just run qlist and type the list in Terminal, ending input with ⌃d on a blank line, or pipe input in from pbpaste or a file.
The qlistpb alias at the end is just a shortcut for piping the output to the clipboard instead of STDOUT.
qlist: quick markdown list
# output a quick markdown list from stdin to stdout
qlist(){sed-E'/^[ ]*$/d'|sed -E's/^([ ]*)/\1* /'}# quick list to clipboardalias qlistpb="qlist|pbcopy"
Quickly list IP addresses for the current machine
Next, a function to quickly list internal and WAN ip addresses. It uses ifconfig for the local IP, and then dig with the OpenDNS resolver for the WAN address. It works just as well with icanhazip.com using curl -sS icanhazip.com instead of the dig command, but I have more faith in the OpenDNS method being futureproof.
Updated: Thanks to comments from Keith Rollin and Daniel Whicker the script now iterates through all available network interfaces to find one that’s active.
# l(ist)ips Get local and WAN IP adddresses# Updated based on comments from Keith Rollin and Daniel Whicker# $ lips# Local IP: 10.0.1.4# External IP: 41.32.11.102
lips(){local interface ip
for interface in$(networksetup -listallhardwareports | awk'/^Device: /{print $2}');do
ip=$(ipconfig getifaddr $interface)["$ip"!=""]&&break
done
local locip extip
["$ip"!=""]&&locip=$ip||locip="inactive"ip=`dig +short myip.opendns.com @resolver1.opendns.com`["$ip"!=""]&&extip=$ip||extip="inactive"printf'%11s: %s\n%11s: %s\n'"Local IP"$locip"External IP"$extip}
Convert HEX to RGB
Lastly, a function to convert hex color string to RGB using printf. This one takes a 6-character hex code (e.g. #faf1cb) and converts it to an RGB string, (e.g. rgb(250,241,203)).
The leading hash (#) is optional and will be cleared out if it exists. The hex string is case-insensitive, so FAF1CB will work as well. If the input given is 3 characters, it will be automatically expanded, doubling each character, so #666 becomes #666666.
If you want to include a CSS transparency indicator in the output (RGBA), you can include a second argument that consists of a float between 0 and 1, e.g. 0.5. hex2rgb 010 .5 becomes rgba(0,17,0,.5).
If you want just the numbers without the rgb(), change the line local css=true to local css=. Then hex2rgb faf1cb returns 250,241,203.
hex2rgb: convert hex color strings to rgb
# Convert hex string to rgb# @param 1 (String) 3 or 6 character hex string# Case insensitive, leading # optional (01a, fff1b1, #ABB)# @param 2 (Float) optional float from 0 to 1# If provided, outputs an rgba() string## $ hex2rgb FA0133# rgb(250,1,51)# $ hex2rgb FA0133 .5# rgba(250,1,51,.5)
hex2rgb(){local css=true
local printstring
local hex="$(tr'[:lower:]''[:upper:]'<<<${1#\#})"# Convert ABC to AABBCCif[[$hex=~ ^[A-F0-9]{3}$ ]];then
hex=$(sed-e's/\(.\)/\1\1/g'<<<$hex)fi# If the first param is a valid hex string, convert to rgbif[[$hex=~ ^[A-F0-9]{6}$ ]];then# If second param exists and is a float between 0 and 1, output rgbaif[[-n$2&&$2=~ ^(0?\.[0-9]+|1(\.0)?)$ ]];then[[$css]]&&printstring="rgba(%d,%d,%d,%s)"||printstring="%d,%d,%d,%s"printf$printstring 0x${hex:0:2} 0x${hex:2:2} 0x${hex:4:2}$2else[[$css]]&&printstring="rgb(%d,%d,%d)"||printstring="%d,%d,%d"printf$printstring 0x${hex:0:2} 0x${hex:2:2} 0x${hex:4:2}fi# If it's not valid hex, return the original stringelse
echo-n$@fi}