繁体   English   中英

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

[英]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

眼前的问题是,每个day变量中的$number都会立即展开,因此Sunday的值实际上是

'' apples
'' oranges

您可能需要在外部使用单引号来防止扩展; 内引号只​​是常规字符。

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

您需要的是一个功能:

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

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

然后,从循环中调用它:

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

CountFruits {1..3}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM