电子邮件shell脚本第2部分

时间:2014-03-18 15:18:35

标签: shell email scripting

我正在创建一个shell脚本,该脚本使用邮件功能接收用户输入和文本的人。我希望它更先进。现在,它只是一次发短信一个人,我希望它能够发送多个人,甚至每个用户输入“全部”的文本。

#!/bin/sh

# Prefix the numbers with something
number_Joe=8881235555
number_Bob=8881235556

echo "Who do you want to text?:(i.e. Joe, Bob, etc)"
read name
echo "What do you want to say?:"
read quote

# Remove any dangerous characters that the user enters
sanitized=$(printf "%s" "$name" | tr -cd 'a-zA-Z')

#Look up by evaluating e.g. "number=$number_Joe"
eval "number=\$number_$sanitized"

if [ "$number" ] 
then
    echo "texting $name ($number) with $quote"
    printf "%s\n" "$quote" | mailx -s "Text Message via email" "$number@txt.att.net"
else
    echo "Unknown user"
    exit 1
fi

另外,是否有一种更简洁的方法来引入一个包含数字而不是脚本的外部txt文件? (注意:我们仍然有bash< 4,因此我没有使用关联数组)

1 个答案:

答案 0 :(得分:0)

这是一个重写。 应该在bash3中正常工作。

#!/bin/bash

# Prefix the numbers with something
names=()
names+=(Joe); numberJoe=8881235555
names+=(Bob); numberBob=8881235556

domain=txt.att.example.com

usage () {
    echo "usage: $(basename $0) names message ..."
    echo "where: names is a comma-separated list of names (no spaces)"
    echo
    echo "example: $(basename $0) Jim,Fred hello lads, this is my message"
}

while getopts ":hl" opt; do
    case $opt in
        h) usage; exit ;;
        l) IFS=,; echo "known names: ${names[@]}"; exit ;;
    esac
done
shift $((OPTIND - 1))

if (( $# < 2 )); then
    usage
    exit
fi

IFS=, read -ra usernamelist <<<"$1" 
shift
message="$*"

# validate names
namelist=()
for name in "${usernamelist[@]}"; do
    if [[ " ${names[@]} " == *" $name "* ]]; then
        namelist+=("$name")
    else
        echo "unknown name: $name" >&2
    fi
done
if (( ${#namelist[@]} == 0 )); then
    echo "no valid names given" >&2
    exit 1
fi

# generate the recipient list
echo "texting '$message' to:"
recipients=()
for name in "${namelist[@]}"; do
    numvar="number$name"
    echo "   $name -> ${!numvar}"
    recipients+=( "${!numvar}@$domain" )
done

# send it
printf "%s\n" "$message" | mailx -s "Text Message via email" "$(IFS=,; echo "${recipients[*]}")"