该命令采用单个数字参数并根据公式打印出星期几

该命令采用单个数字参数并根据公式打印出星期几
days=('Sunday''Monday')
days=('Tuesday''Wednesday')
days=('Thursday''Friday')
days=('Saturday')

for numbers in "S@";

do
        if [ $numbers -ge 0 ];
        then
                result=$(($numbers % 7))
                echo ${days[$result]}
        fi
shift
done

这就是我到目前为止所得到的。

答案1

您在声明数组时遇到问题:

days=('Sunday''Monday')          # this means days[0]="SundayMonday"
days=('Tuesday''Wednesday')      # this means days[0]="TuesdayWednesday"
days=('Thursday''Friday')        # this means days[0]="ThursdayFriday"
days=('Saturday')                # this means days[0]="Saturday"

你要这个:

days=(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

如果需要,您可以引用日期名称,shell 并不关心,因为它们不会发生 shell 扩展。

下一个

for numbers in "S@";

这是一个大写字母,S而不是所需的美元符号$。因此第一次也是唯一一次通过循环时, 的值$numbers将是 2 个字符的字符串S@

除此之外,看起来还不错。

挑剔的小事:

  • 你不需要以分号结束行
  • “numbers”是一个糟糕的变量名,只能保存一个数字
  • bash 在算术表达式中扩展变量时不带印记:

    result=$((numbers % 7))
    echo "${days[result]}"
    
  • 如果您要迭代位置参数,则无需引用它们:

    for number do echo "${days[number % 7]}"; done
    

我会把它写成一个 shell 函数:

day_of_week() {
    local dow=$1
    if [[ $dow -lt 0 ]]; then 
        echo "error: pass a positive number"
        return 1
    fi
    local days=(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
    echo "${days[dow]}"
}

相关内容