如何在字符串变量中识别变量?
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}
我有以下 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}