#!/usr/bin/env bash
# Desc: Gets random line from a newline-delimited file
# Usage: get_rand_line [path FILE]
# Version: 0.0.1

yell() { echo "$0: $*" >&2; } # print script path and all args to stderr
die() { yell "$*"; exit 111; } # same as yell() but non-zero exit status
must() { "$@" || die "cannot $*"; } # runs args as command, reports args if command fails
get_rand_line() {
    # Input: arg1 : file path
    #        stdout: random line from input file
    # Usage: get_rand_line [path FILE]
    # Depends: GNU Coreutils 8.32 (shuf)
    
    # Check if file
    if [[ ! -f "$1" ]]; then die "FATAL:Not a file:$1"; fi;
    if [[ $# -ne 1 ]]; then die "FATAL:Incorrect argument count:$1"; fi;

    # Get line count
    lc="$(wc -l "$1" | awk '{print $1}')";

    # Calc random line number (zero-indexed)
    ln="$(shuf -i 0-"$((lc - 1))" -n1)";

    n=0;
    while read -r line; do
        # Check if line is target line
        if [[ $n -eq $ln ]]; then
            printf "%s\n" "$line"; # output
        fi;
        ((n++));
    done < "$1";
}; # Returns random line from newline-delimited file
main() {
    get_rand_line "$@";
};

main "$@";