bash:如何用特殊字符检查双变量故障?

时间:2017-10-13 22:12:50

标签: bash

我想用以下脚本进行双重替换。

#!/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。我尝试了几种方法,但还不是很正确。感谢。

1 个答案:

答案 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删除任何非字母数字字符。

每当您发现自己使用编号变量时,如p2p3import 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) 等,这肯定表明您应该使用数组。

相关问题