bash3boilerplate/src/parse_url.sh
2016-06-21 13:48:08 +02:00

71 lines
1.9 KiB
Bash

#!/usr/bin/env bash
# BASH3 Boilerplate: parse_url
#
# This file:
#
# - Takes a URL and parses protocol, user, pass, host, port, path.
#
# Based on:
#
# - http://stackoverflow.com/a/6174447/151666
#
# Usage as a function:
#
# source parse_url.sh
# parse_url 'http://johndoe:abc123@example.com:8080/index.html' pass
#
# Usage as a command:
#
# parse_url.sh 'http://johndoe:abc123@example.com:8080/index.html'
#
# Based on a template by BASH3 Boilerplate v2.0.0
# Copyright (c) 2013 Kevin van Zonneveld and contributors
# http://bash3boilerplate.sh/#authors
function parse_url() {
local parse="${1}"
local need="${2:-}"
local proto="$(echo $parse | grep :// | sed -e's,^\(.*://\).*,\1,g')"
local url="$(echo ${parse/$proto/})"
local userpass="$(echo $url | grep @ | cut -d@ -f1)"
local user="$(echo $userpass | grep : | cut -d: -f1)"
local pass="$(echo $userpass | grep : | cut -d: -f2)"
local hostport="$(echo ${url/$userpass@/} | cut -d/ -f1)"
local host="$(echo $hostport | grep : | cut -d: -f1)"
local port="$(echo $hostport | grep : | cut -d: -f2)"
local path="$(echo $url | grep / | cut -d/ -f2-)"
[ -z "${user}" ] && user="${userpass}"
[ -z "${host}" ] && host="${hostport}"
if [ -z "${port}" ]; then
[ "${proto}" = "http://" ] && port="80"
[ "${proto}" = "https://" ] && port="443"
[ "${proto}" = "mysql://" ] && port="3306"
[ "${proto}" = "redis://" ] && port="6379"
fi
if [ -n "${need}" ]; then
echo ${!need}
else
echo ""
echo " Use second argument to return just 1 variable."
echo " parse_url() demo: "
echo ""
echo " proto: ${proto}"
echo " user: ${user}"
echo " pass: ${pass}"
echo " host: ${host}"
echo " port: ${port}"
echo " path: ${path}"
echo ""
fi
}
if [ "${BASH_SOURCE[0]}" != ${0} ]; then
export -f parse_url
else
parse_url "${@}"
exit ${?}
fi