#!/bin/sh conv() { while [ $# -gt 0 ]; do if printf "%s" "$1" | grep -qE '^[0-9]+$'; then if [ "$m" -eq 0 ]; then printf "Decimal %s → Hex: " "$1" fi printf "%s" "$p" printf "%X\n" "$1" elif printf "%s" "$1" | grep -qE '^0b[0-1]+$'; then if [ "$m" -eq 0 ]; then printf "Binary %s → Hex: " "$1" fi printf "%s" "$p" printf "%X\n" "$1" else printf "Error: '%s' is not a valid binary or decimal number\n" "$1" >&2 stat=1 fi shift done return "$stat" } main() { USAGE="usage: tohex [-lmnp] ..." if ! [ "$1" = "x" ] && ! [ -t 0 ]; then cat | tr '\n' ' ' | xargs tohex "x" "$@" return "$?" elif [ "$1" = "x" ]; then shift fi if [ $# -eq 0 ]; then printf "Error: No arguments provided\n%s\n" "$USAGE" >&2 return 2 fi stat=0 l=0; m=0; n=0; p="" while getopts "lmnp" flag; do case "$flag" in l) l=1; ;; m) m=1; ;; n) n=1; ;; p) p="0x" ;; *) printf "%s\n" "$USAGE" >&2 ; return 2 ;; esac done shift $(( OPTIND - 1 )) t=$(conv "$@") stat=$? if [ "$n" -eq 1 ] && [ "$m" -eq 1 ]; then t=$(printf "%s" "$t" | tr '\n' ' ') elif [ "$n" -eq 1 ] && [ "$m" -eq 0 ]; then t=$(printf "%s" "$t" | tr '\n' ';') else t=$(printf "%s" "$t") fi if [ "$l" -eq 1 ]; then t=$(printf "%s" "$t" | tr '[:upper:]' '[:lower:]') fi printf "%s\n" "$t" return "$stat" } main "$@"