Bash 如何使用日期+;%u用给定的一天来查找星期几的数字

Bash 如何使用日期+;%u用给定的一天来查找星期几的数字,bash,date,Bash,Date,是否有方法使用$date+%u计算特定给定日期的星期几?我将在预测估计中使用这条线 例如: DOW=Monday day_no=`date "$DOW" +%u` # Should output 1 echo "$DOW is $day_no" 或者我应该使用if或case方法: if [ "$DOW" == "Monday" ] then day_no=1 elif [.....] then .... 第一种方法是3行,if或case方法是20+行 我正在使用B

是否有方法使用$date+%u计算特定给定日期的星期几?我将在预测估计中使用这条线

例如:

DOW=Monday
day_no=`date "$DOW" +%u`    # Should output 1
echo "$DOW is $day_no"       
或者我应该使用if或case方法:

if [ "$DOW" == "Monday" ]
then
   day_no=1
elif [.....]
then
 ....
第一种方法是3行,if或case方法是20+行


我正在使用Bash。

如果您将
$DOW
传递给
-d
标志,该标志读取要格式化的时间描述,它将为您提供所需的:

day_no=$(date -d "$DOW" +%u)

请注意,这会将1分配到星期一,7分配到星期天。

实现这一点的方法很多

如果您想使用特定于bash的东西,我建议使用数组。在bash 4中,可以像这样使用关联数组:

declare -A days='([Monday]="1" [Tuesday]="2" etc...)'

DOW="Monday"

day_no=${days[$DOW]}
如果您在Bash3中(例如在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没有提到他的操作系统——重要的是要提供可移植的答案。