Как сделать переменную, распознанную в строковой переменной? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть следующий скрипт 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

1 Ответ

0 голосов
/ 21 ноября 2018

Непосредственная проблема заключается в том, что $number в каждой из ваших переменных дня раскрывается немедленно , поэтому значение Sunday на самом деле

'' apples
'' oranges

Вам необходимо использоватьодинарные кавычки на снаружи для предотвращения расширения;внутренние кавычки - это просто обычные символы.

Однако это не сработает, поскольку строка $number внутри переменной также является просто текстовым текстом;он не будет расширен с текущим значением $number при расширении $Day или $day.

Вам нужна функция:

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}
...