我想用以下脚本进行双重替换。
#!/bin/bash
p1="Alice"
p2="Bob"
p3="Charlie"
p4="David"
map_people()
{
p=`eval echo "\\${p$1}"`
if [ -z "$p" ]; then
echo $1
else
echo $p
fi
}
大部分都是正确的
map_people 1
Alice
map_people 5
5
map_people John
John
map_people John-Smith
Smith
除了最后一个,我想要归还John-Smith。我尝试了几种方法,但还不是很正确。感谢。
答案 0 :(得分:2)
问题是-
不是变量名中的有效字符,它在参数扩展中具有特殊含义。当你这样做
map_people John-Smith
执行:
p=`eval echo "\\${pJohn-Smith}"
相当于:
p=`echo ${pJohn-Smith}`
-
字符用于在未设置变量时提供默认值。所以这意味着如果p
设置为$pJohn
,则设置为Smith
,如果不设置则设置为$pJohn
。因此,当没有变量p=Smith
时,这会echo $p
,然后-
会打印出来。
无法逃脱-
以使其得到字面上的对待。变量名中不允许$1
,因此如果您尝试这样做会出错。您根本无法尝试将任意输入用作变量名称的一部分。在使用之前,您可以尝试从p1
删除任何非字母数字字符。
每当您发现自己使用编号变量时,如p2
,p3
,import random
doors = ['a', 'b', 'c']
total_days = 0
runs = 1000
for i in range(runs):
days = 0
choice = None
while choice != 'c':
choice = random.choice(doors)
if choice == 'a':
days += 2
if choice == 'b':
days += 3
if choice == 'c':
days += 1
total_days += days
avg_days = total_days / runs
print(avg_days)
等,这肯定表明您应该使用数组。