#!/bin/sh vfmt="BEGIN:VCARD\r\n\ VERSION:3.0\r\n\ N:%s;;;;\r\n\ FN:%s\r\n\ TEL;TYPE=CELL:%s\r\n\ END:VCARD\r\n" die() { : "${1:?}" printf "\033[31;1merr: %b\033[0m\n" "$1" 1>&2 exit "${2:-1}" } usage() { cat <<- EOF Usage: ${0##*/} [options] [ contacts.csv ] convert csv file to vcf file Options: -h show this help cruft -f path to csv file EOF } trimstr() { # usage trimstr : "${1:?}" _str="${1%"${1##*[![:space:]]}"}" _str="${_str#"${_str%%[![:space:]]*}"}" printf "%s" "$_str" unset _str } makev() { # usage makev : "${1:?}" : "${2:?}" # shellcheck disable=SC2059 printf "$vfmt" "$1" "$1" "$2" } ######## # MAIN # ######## file= while getopts "hf:" f; do case "$f" in f) file="$OPTARG" ;; h) usage exit ;; *) usage exit 1 esac done if [ -n "$file" ] && [ "$(file --brief --dereference --mime-type "$file")" != "application/csv" ]; then die "input is not a csv file" fi while read -r entry; do name=$(trimstr "${entry%%,*}") no=$(trimstr "${entry#*,}") makev "$name" "$no" done <"${file:-/dev/stdin}"