许多方法来实现这一点。
如果你想使用特定于bash的东西,我会建议一个数组。在bash 4,关联数组可以使用这样的:
declare -A days='([Monday]="1" [Tuesday]="2" etc...)'
DOW="Monday"
day_no=${days[$DOW]}
如果在bash 3(在OSX例如)的时候,可能必须通过非关联数组滚动。
declare -a days='([1]="Monday" [2]="Tuesday" etc...)'
DOW="Monday"
for _ in "${!days[@]}"; do
if [ "${days[$_]}" = "$DOW" ]; then
day_no=$_
break
fi
done
如果你想用date
命令来处理这个问题,是要知道你所使用的平台是很重要的,因为date
在不同的操作系统具有不同的行为。以下可能为你工作:
case $(uname -s) in
Linux) day_no=$(date -d "$DOW" '+%u') ;;
*BSD|Darwin) day_no=$(date -j -f '%A' "$DOW" '+%u') ;;
*)
echo "ERROR: I don't know how to do this in $(uname -s)." >&2
exit 1
;;
esac
注意的是,基于阵列的解决方案威力的一个很可能是比需要调用外部程序(date
)的解决方案更快。
这适用于Linux,但不适用于OSX或FreeBSD。 OP没有提到他的操作系统 - 生成便携式答案很重要。 – ghoti