#!/bin/bash expected_mount_point="" function usage { retval="$1" case "$retval" in 0) ;; *) exec 1>&2 ;; esac echo "Usage: $0 --mount-point /mnt --help" echo echo "Accepts df output on stdin. Returns bytes in use." exit "$retval" } while [ "$#" -ge 1 ] do case "$1" in --mount-point) expected_mount_point="$2" shift ;; --help|-h) usage 0 ;; *) echo "$0: unrecognized option: $1" 1>&2 usage 1 ;; esac shift done all_good=True tab="$(printf '\t')" case "$expected_mount_point" in "") echo "$0: --mount-point is a required option" 1>&2 all_good=False ;; *' '*|*"$tab"*) echo "$0: --mount-point must not specify a mount point with spaces or tabs in it" 1>&2 all_good=False ;; esac df_output=$(set -eu; cat) line_count=$(echo "$df_output" | wc -l) if [ "$line_count" != 2 ] then echo "$0: df line count not 2: $line_count" 1>&2 all_good=False fi case "$all_good" in True) ;; False) echo "$0: One or more items in the preflight check failed" exit 1 ;; *) echo "$0: internal error: \$all_good neither True nor False: $all_good" 1>&2 exit 1 ;; esac header_line=$(echo "$df_output" | head -1 | tr '[:upper:]' '[:lower:]') stats_line=$(echo "$df_output" | head -2 | tail -1) if echo "$header_line" | grep -Eq "^filesystem *1k-blocks *used *available *use% *mounted on$" then one_k_blocks=$(echo "$stats_line" | awk ' { print $3 }') actual_mount_point=$(echo "$stats_line" | awk ' { print $6 }') elif echo "$header_line" | grep -Eq "^filesystem *1024-blocks *used *available *capacity *iused *ifree *%iused *mounted on$" then one_k_blocks=$(echo "$stats_line" | awk ' { print $3 }') actual_mount_point=$(echo "$stats_line" | awk ' { print $9 }') else echo "$0: Error: This does not appear to be a Linux or MacOS df -k." 1>&2 exit 1 fi if [ "$expected_mount_point" != "$actual_mount_point" ] then echo "$0: error: \$expected_mount_point != \$actual_mount_point: $expected_mount_point $actual_mount_point" 1>&2 exit 1 fi echo $((one_k_blocks * 1024))