327 lines
13 KiB
Bash
327 lines
13 KiB
Bash
#!/usr/bin/env bash
|
||
|
||
# https://chillcog.com
|
||
# Haiiiii - @chillcog
|
||
# Licensed Under The MIT License
|
||
|
||
clear
|
||
|
||
PRIVATE_MODE=0
|
||
|
||
show_help() {
|
||
cat << EOF
|
||
Usage: $(basename "$0") [OPTIONS]
|
||
|
||
A custom system information fetch script featuring ASCII art.
|
||
|
||
Options:
|
||
-h, --help Show this help message and exit.
|
||
-p, -private, Private mode: hides uniquely identifying information
|
||
--private (hostname, public/local IP, hardware model).
|
||
|
||
EOF
|
||
exit 0
|
||
}
|
||
|
||
for arg in "$@"; do
|
||
case "$arg" in
|
||
-h|--help)
|
||
show_help
|
||
;;
|
||
-p|-private|--private)
|
||
PRIVATE_MODE=1
|
||
;;
|
||
*)
|
||
echo "Unknown option: $arg"
|
||
echo "Use -h or --help for usage."
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
c0=$'\e[0m'
|
||
blue=$'\e[34m'
|
||
c1=$'\e[36m'
|
||
c2=$'\e[35m'
|
||
|
||
OS_TYPE="$(uname -s)"
|
||
ARCH="$(uname -m)"
|
||
|
||
USER_NAME="$(whoami)"
|
||
if [ "$PRIVATE_MODE" -eq 1 ]; then
|
||
HOST_NAME="[REDACTED]"
|
||
else
|
||
HOST_NAME="$(hostname 2>/dev/null || uname -n)"
|
||
fi
|
||
user_host="${USER_NAME}@${HOST_NAME}"
|
||
|
||
get_os() {
|
||
if [ "$OS_TYPE" = "Linux" ]; then
|
||
if [ -f /etc/os-release ]; then
|
||
source /etc/os-release && echo "$NAME ($ARCH)"
|
||
else
|
||
echo "Linux ($ARCH)"
|
||
fi
|
||
elif [ "$OS_TYPE" = "Darwin" ]; then
|
||
echo "macOS $(sw_vers -productVersion 2>/dev/null) ($ARCH)"
|
||
else
|
||
echo "$OS_TYPE ($ARCH)"
|
||
fi
|
||
}
|
||
os=$(get_os)
|
||
|
||
kernel="$(uname -r)"
|
||
|
||
get_motherboard() {
|
||
if [ "$PRIVATE_MODE" -eq 1 ]; then
|
||
echo "[REDACTED]"
|
||
return
|
||
fi
|
||
|
||
if [ -f /sys/devices/virtual/dmi/id/product_name ]; then
|
||
local vendor name ver
|
||
vendor=$(cat /sys/devices/virtual/dmi/id/sys_vendor 2>/dev/null)
|
||
name=$(cat /sys/devices/virtual/dmi/id/product_name 2>/dev/null)
|
||
ver=$(cat /sys/devices/virtual/dmi/id/product_version 2>/dev/null)
|
||
echo "${vendor} ${name} ${ver}" | xargs
|
||
elif command -v sysctl >/dev/null 2>&1 && [ "$OS_TYPE" = "Darwin" ]; then
|
||
sysctl -n hw.model 2>/dev/null
|
||
else
|
||
echo "N/A"
|
||
fi
|
||
}
|
||
host_model=$(get_motherboard)
|
||
|
||
uptime_str=$(uptime 2>/dev/null | sed -E 's/.*up[[:space:]]+([^,]+).*/\1/' | xargs)
|
||
[ -z "$uptime_str" ] && uptime_str="N/A"
|
||
|
||
get_packages() {
|
||
local pkgs=""
|
||
if command -v pacman >/dev/null 2>&1; then
|
||
pkgs="$(pacman -Qq 2>/dev/null | wc -l | xargs) (pacman)"
|
||
elif command -v dpkg >/dev/null 2>&1; then
|
||
pkgs="$(dpkg -l 2>/dev/null | grep -c '^ii') (dpkg)"
|
||
elif command -v rpm >/dev/null 2>&1; then
|
||
pkgs="$(rpm -qa 2>/dev/null | wc -l | xargs) (rpm)"
|
||
elif command -v brew >/dev/null 2>&1; then
|
||
pkgs="$(brew list --formula 2>/dev/null | wc -l | xargs) (brew)"
|
||
elif command -v nix-store >/dev/null 2>&1; then
|
||
pkgs="$(nix-store -q --requisites /run/current-system 2>/dev/null | wc -l | xargs) (nix)"
|
||
else
|
||
pkgs="N/A"
|
||
fi
|
||
echo "$pkgs"
|
||
}
|
||
packages=$(get_packages)
|
||
|
||
get_shell() {
|
||
local sh_bin
|
||
sh_bin="$(basename "${SHELL:-bash}")"
|
||
case "$sh_bin" in
|
||
bash) echo "bash $($SHELL --version 2>/dev/null | head -n1 | awk '{print $4}')" ;;
|
||
zsh) echo "zsh $($SHELL --version 2>/dev/null | awk '{print $2}')" ;;
|
||
fish) echo "fish $($SHELL --version 2>/dev/null | awk '{print $3}')" ;;
|
||
*) echo "$sh_bin" ;;
|
||
esac
|
||
}
|
||
shell_info=$(get_shell)
|
||
|
||
de="${XDG_CURRENT_DESKTOP:-${DESKTOP_SESSION:-N/A}}"
|
||
wm="${XDG_SESSION_DESKTOP:-N/A}"
|
||
[ "$OS_TYPE" = "Darwin" ] && de="Aqua" && wm="Quartz Compositor"
|
||
|
||
terminal="${TERM_PROGRAM:-${TERM:-N/A}}"
|
||
|
||
get_display() {
|
||
if command -v xrandr >/dev/null 2>&1; then
|
||
xrandr 2>/dev/null | awk '/\*/ {print $1 " @" $2 "Hz"; exit}' | tr -d '*' | xargs
|
||
elif [ "$OS_TYPE" = "Darwin" ]; then
|
||
system_profiler SPDisplaysDataType 2>/dev/null | awk -F: '/Resolution/ {print $2}' | head -n1 | xargs
|
||
else
|
||
echo "N/A"
|
||
fi
|
||
}
|
||
display_info=$(get_display)
|
||
[ -z "$display_info" ] && display_info="N/A"
|
||
|
||
get_cpu() {
|
||
if command -v lscpu >/dev/null 2>&1; then
|
||
local model cores
|
||
model=$(lscpu | awk -F: '/Model name/ {print $2}' | xargs)
|
||
cores=$(lscpu | awk -F: '/CPU\(s\):/ {print $2}' | head -n1 | xargs)
|
||
echo "${model} (${cores} threads)"
|
||
elif [ "$OS_TYPE" = "Darwin" ]; then
|
||
local model cores
|
||
model=$(sysctl -n machdep.cpu.brand_string 2>/dev/null)
|
||
cores=$(sysctl -n hw.ncpu 2>/dev/null)
|
||
echo "${model} (${cores} cores)"
|
||
else
|
||
echo "N/A"
|
||
fi
|
||
}
|
||
cpu=$(get_cpu)
|
||
[ -z "$cpu" ] && cpu="N/A"
|
||
|
||
get_gpu() {
|
||
if command -v lspci >/dev/null 2>&1; then
|
||
lspci 2>/dev/null | grep -E 'VGA|3D' | awk -F: '{print $3}' | sed 's/ (rev .*//' | head -n1 | xargs
|
||
elif [ "$OS_TYPE" = "Darwin" ]; then
|
||
system_profiler SPDisplaysDataType 2>/dev/null | awk -F: '/Chipset Model/ {print $2}' | head -n1 | xargs
|
||
else
|
||
echo "N/A"
|
||
fi
|
||
}
|
||
gpu=$(get_gpu)
|
||
[ -z "$gpu" ] && gpu="N/A"
|
||
|
||
get_memory() {
|
||
if command -v free >/dev/null 2>&1; then
|
||
free -m | awk '/Mem:/ {printf "%sMB / %sMB (%.0f%%)", $3, $2, ($3/$2)*100}'
|
||
elif [ "$OS_TYPE" = "Darwin" ]; then
|
||
local total_mem
|
||
total_mem=$(sysctl -n hw.memsize 2>/dev/null)
|
||
total_mem=$((total_mem / 1024 / 1024))
|
||
echo "${total_mem}MB Total"
|
||
else
|
||
echo "N/A"
|
||
fi
|
||
}
|
||
memory=$(get_memory)
|
||
|
||
get_swap() {
|
||
if command -v free >/dev/null 2>&1; then
|
||
free -m | awk '/Swap:/ {if ($2>0) printf "%sMB / %sMB (%.0f%%)", $3, $2, ($3/$2)*100; else print "Disabled"}'
|
||
else
|
||
echo "N/A"
|
||
fi
|
||
}
|
||
swap=$(get_swap)
|
||
|
||
disk=$(df -h / 2>/dev/null | awk 'NR==2 {print $3 " / " $2 " (" $5 ")"}')
|
||
|
||
get_temp() {
|
||
if command -v sensors >/dev/null 2>&1; then
|
||
sensors 2>/dev/null | awk '/Package id 0:|Core 0:|cpu_thermal/ {print $2; exit}' | tr -d '+'
|
||
elif [ -f /sys/class/thermal/thermal_zone0/temp ]; then
|
||
local raw
|
||
raw=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null)
|
||
echo "$((raw / 1000))°C"
|
||
else
|
||
echo "N/A"
|
||
fi
|
||
}
|
||
cpu_temp=$(get_temp)
|
||
[ -z "$cpu_temp" ] && cpu_temp="N/A"
|
||
|
||
load_avg=$(uptime 2>/dev/null | awk -F'load average:' '{print $2}' | xargs)
|
||
[ -z "$load_avg" ] && load_avg="N/A"
|
||
|
||
if [ "$PRIVATE_MODE" -eq 1 ]; then
|
||
local_ip="[HIDDEN]"
|
||
public_ip="[HIDDEN]"
|
||
else
|
||
get_ip() {
|
||
if command -v ip >/dev/null 2>&1; then
|
||
ip route get 1.1.1.1 2>/dev/null | awk '{print $7}'
|
||
elif command -v ifconfig >/dev/null 2>&1; then
|
||
ifconfig 2>/dev/null | awk '/inet / && !/127.0.0.1/ {print $2}' | head -n1
|
||
else
|
||
echo "N/A"
|
||
fi
|
||
}
|
||
local_ip=$(get_ip)
|
||
[ -z "$local_ip" ] && local_ip="N/A"
|
||
public_ip=$(curl -s --max-time 1 https://icanhazip.com 2>/dev/null || echo "Offline/N/A")
|
||
fi
|
||
|
||
get_battery() {
|
||
if [ -d /sys/class/power_supply ]; then
|
||
local cap status
|
||
cap=$(cat /sys/class/power_supply/BAT*/capacity 2>/dev/null | head -n1)
|
||
status=$(cat /sys/class/power_supply/BAT*/status 2>/dev/null | head -n1)
|
||
if [ -n "$cap" ]; then
|
||
echo "${cap}% [${status:-Unknown}]"
|
||
else
|
||
echo "AC Powered"
|
||
fi
|
||
elif command -v pmset >/dev/null 2>&1; then
|
||
pmset -g batt 2>/dev/null | grep -o '[0-9]*%' | head -n1
|
||
else
|
||
echo "N/A"
|
||
fi
|
||
}
|
||
battery=$(get_battery)
|
||
|
||
locale_val="${LANG:-N/A}"
|
||
|
||
raw_logo=$(cat << 'EOF'
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⠲⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣷⡄⠈⢢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣄⠀⠀⠀⠀⠀⠀⢀⣾⡀⠀⠀⠀⠀⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡓⠦⢄⣀⠀⠀⡼⠻⠿⢶⡄⠀⠀⠀⠘⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⢀⡤⠤⠤⣤⣤⣴⣶⣶⠶⠶⠶⠒⠒⠂⠙⠀⠀⠀⠉⠉⠓⠲⢤⣀⠀⠀⠀⠀⠀⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠈⢿⠈⠳⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠢⣄⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠈⡇⠀⠀⠀⠀⠀⢀⣿⡋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣟⠁⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠸⡀⠀⠀⠀⠀⢈⡽⠁⠀⠀⠠⡄⠀⠀⠀⠀⠀⠀⠀⣄⠀⠀⠀⠀⠀⠀⠘⡆⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠱⡀⠀⠀⣠⠞⠀⠀⠀⠀⣠⢧⠀⠀⠀⠀⠀⠀⠀⠘⣆⠀⠀⠀⠀⠀⠀⢹⠀⣸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢆⡴⠃⠀⠀⠀⢠⠞⠁⠈⢣⡀⣄⠀⠀⠀⠀⠀⠘⣆⠀⠀⠀⠀⠀⢸⣠⡇⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⢞⣓⣸⠀⢠⠰⣋⣀⣀⣳⢤⡙⢾⣟⠲⢤⣀⣠⠄⢯⠳⡀⠀⠀⠀⠸⠋⡇⠀⠀⠀⠀⠀⠀⢠⠏⠹⡄⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⣿⠀⢸⢰⠋⠀⣸⣿⣿⡆⠀⠈⠃⢤⣯⣿⡶⠾⣄⠘⡦⠀⠀⢀⣦⣿⠀⠀⠀⠀⠀⢠⠃⠀⠀⢳⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⢸⣼⣀⡀⠣⠽⠿⢃⠀⠀⠀⢾⣻⣿⡿⠀⣸⡸⠁⠀⢀⡼⡼⠉⠳⣄⠀⠀⣰⠃⠀⠀⠀⢸⠇
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠟⣷⡘⣿⣛⡁⠀⠀⠀⠀⠁⠀⠀⠀⠉⠍⠡⣶⡿⠁⠀⣠⠟⣇⡇⠀⠀⠈⢦⣰⠁⠀⠀⠀⠀⢸⠂
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠖⢻⣣⣈⣿⣤⠤⢒⠒⠦⠖⠢⠴⢄⣀⢬⣷⠞⢁⣠⠞⣡⠞⢹⡟⠀⠀⠀⠀⠃⠀⠀⠀⠀⢀⡞⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢏⣻⡶⠞⠉⠛⢉⣆⣴⡞⠻⠦⣾⢿⣊⣉⡴⣶⠁⠀⠀⠑⢄⡀⢀⢰⠋⢦⠀⠀⣠⠞⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢨⣿⣤⣶⣦⠀⠀⡇⠀⠀⣤⣄⠹⡟⠛⢷⠀⠁⠀⠀⠀⠀⠀⠙⠺⣏⣀⠈⢷⠚⠁⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⢿⣿⣿⣝⢿⡇⠀⣧⢠⣾⣿⣿⣿⡿⡄⢸⡄⠀⠀⠀⠀⠀⠀⠀⢸⠏⠉⠁⠈⡆⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡟⠀⠀⠀⠙⠃⠀⢸⣿⠈⠱⠟⠛⠛⠃⢹⢸⣿⡄⠀⠀⠀⣤⡀⢀⡿⠛⠓⠂⢀⢱⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣸⡀⠀⠀⠀⠀⠀⣠⢟⣸⠦⣄⣀⠀⠀⠀⠘⣸⠹⣟⡆⠀⡼⠁⠙⣾⣷⣦⣄⠀⠀⢸⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠞⠉⠀⠘⡇⠀⣀⣀⡠⠞⣱⠋⠀⠀⠀⠈⠙⢦⡀⠀⢹⡚⠉⠀⢰⠃⠀⠀⠀⠘⣆⠀⠉⠀⢸⡇⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⢀⣜⠁⠀⠀⠀⠀⠙⠉⢹⣿⠁⢰⠃⠀⠀⠀⠀⠀⠀⠀⠑⣦⣬⠇⠀⢀⡏⠀⠀⠀⠀⠉⠀⠀⠀⢀⢸⡇⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⡠⠟⠛⠛⠷⠂⠀⠀⠀⠀⠈⣿⢠⡇⣠⣤⣤⣤⣀⠀⠀⠀⠀⠘⣿⣶⣶⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⡞⢸⠃⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⢀⣾⣷⣤⣤⠀⠀⠀⠀⠀⠀⠀⠀⠛⡼⢉⢉⣉⣉⠛⠻⢷⣄⠀⠀⠀⣸⣯⠙⢿⣧⠀⠀⠀⠀⠀⠀⢀⡼⠁⡼⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⡰⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡤⠀⡗⠛⠛⠻⠿⣷⣦⣀⠀⠀⠀⠀⠘⢻⠀⠀⠙⠃⠀⠀⠀⠀⡠⠊⠀⢠⠃⠀⠀⠀⠀
|
||
⠀⣠⣖⣟⣳⣒⣆⠀⠀⠀⠀⠀⠀⠀⠀⣠⣎⠀⢸⠁⠀⠀⠀⠀⠀⠉⠉⠀⢸⠀⠀⠀⣏⠀⠀⠀⠀⠀⠠⠒⠋⠀⠀⢠⠏⠀⠀⠀⠀⠀
|
||
⠰⣿⣿⣶⠿⠷⣾⠃⠀⠀⠀⠀⢀⡠⠚⠁⠈⠦⡞⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⠀⠀⡼⠉⠁⠀⠀⠀⠀⠀⠀⠀⣠⠔⠋⠀⠀⠀⠀⠀⠀
|
||
⠀⠹⣦⣓⡒⠋⠉⠀⠀⠀⣀⡴⠋⠀⠀⠀⠀⡼⠁⡀⠀⠀⠀⠀⠀⠀⣠⠏⢀⣠⢾⣁⣀⣀⣀⣀⣠⠤⠒⠚⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠉⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠹⣦⣿⣯⣿⣦⢀⡴⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||
EOF
|
||
)
|
||
|
||
transparent_logo=$(echo "$raw_logo" | sed 's/⠀/ /g' | sed 's/[[:space:]]*$//')
|
||
readarray -t logo <<< "$transparent_logo"
|
||
|
||
labels=(
|
||
"OS:" "Host Model:" "Kernel:" "Uptime:" "Packages:" "Shell:"
|
||
"DE/WM:" "Terminal:" "Resolution:" "CPU:" "CPU Temp:" "GPU:"
|
||
"Memory:" "Swap:" "Disk (/):" "Load Avg:" "Local IP:" "Public IP:"
|
||
"Battery:" "Locale:"
|
||
)
|
||
values=(
|
||
"$os" "$host_model" "$kernel" "$uptime_str" "$packages" "$shell_info"
|
||
"${de} / ${wm}" "$terminal" "$display_info" "$cpu" "$cpu_temp" "$gpu"
|
||
"$memory" "$swap" "$disk" "$load_avg" "$local_ip" "$public_ip"
|
||
"$battery" "$locale_val"
|
||
)
|
||
|
||
info=()
|
||
info+=("${c1}${user_host}${c0}")
|
||
info+=("---------------------------------------")
|
||
|
||
for i in "${!labels[@]}"; do
|
||
lbl=$(printf "%-13s" "${labels[$i]}")
|
||
info+=("${c1}${lbl}${c0} ${c2}${values[$i]}${c0}")
|
||
done
|
||
|
||
target_width=72
|
||
max_lines=$((${#logo[@]} > ${#info[@]} ? ${#logo[@]} : ${#info[@]}))
|
||
|
||
for ((i=0; i<max_lines; i++)); do
|
||
line="${logo[i]}"
|
||
char_count=${#line}
|
||
pad_needed=$((target_width - char_count))
|
||
(( pad_needed < 0 )) && pad_needed=0
|
||
|
||
padding=$(printf '%*s' "$pad_needed" '')
|
||
printf "%s%s%s %s\n" "${blue}${line}${c0}" "$padding" "" "${info[i]}"
|
||
done |