如何在字符串变量中识别变量?

How do I make a variable recognized in a string variable?

我有以下 bash 脚本

#!/bin/bash
Sunday="
   '$number'apples
   '$number'oranges"
Monday="
   '$number'bananas"
# ... you get my drift
Wednesday="
   '$number'bananas
   '$number'oranges"
# ... Until Saturday

range={1..3}

function GetDay()
{
    if [ $(date +%A) == "Sunday" ]; then Day=$Sunday
    elif [ $(date +%A) == "Monday" ]; then Day=$Monday
    elif [ $(date +%A) == "Tuesday" ]; then Day=$Tuesday
    elif [ $(date +%A) == "Wednesday" ]; then Day=$Wednesday
    elif [ $(date +%A) == "Thursday" ]; then Day=$Thurday
    elif [ $(date +%A) == "Friday" ]; then Day=$Friday
    elif [ $(date +%A) == "Saturday" ]; then Day=$Saturday
    fi
}

function CountFruits()
{
    for number in $range
    do
        GetDay
        for day in $Day
        do
            echo $day
            done
        done
}

从星期三开始,我希望它输出

1 bananas
1 oranges
2 bananas
2 oranges
3 bananas
3 oranges

如何使这个脚本工作。它似乎无法识别我的范围。它输出

'' bananas
'' oranges

如果我直接使用范围 for number in {1..3} 而不是变量引用 for number in $range

'' bananas
'' oranges
'' bananas
'' oranges
'' bananas
'' oranges

眼前的问题是$number在你每天的变量中立即展开,所以Sunday的值实际上是

'' apples
'' oranges

您需要在 外部 使用单引号以防止扩展;内引号只​​是普通字符。

但是,这行不通,因为变量中的字符串 $number 也只是文字文本;当 $Day$day 扩展时,它不会用 $number 的当前值扩展。

你需要的是一个函数:

dailyList () {
  #  - day of the week
  #  - a number
  case  in
    Sunday) fruits=(apples oranges) ;;
    Monday) fruits=(bananas) ;;
    # etc
  esac

  for f in "${fruits[@]}"; do
    printf '%d %s' "" "$f"
  done
}

然后,从循环中调用它:

CountFruits () {
  for number in "$@"
  do
    dailyList "$(date +%A)" "$number"
  done
}

CountFruits {1..3}