如何在bash脚本中传递函数的返回值作为数组的索引?

时间:2012-02-21 14:27:25

标签: arrays bash indexing

这是我的程序“try.sh”:

in=$*
type=(even odd)

echo -e $in " is a " ${type[is_odd $in]} " number."

is_odd()
{
    return `expr $1 % 2`
}

但如果我执行“./try.sh”,它会给我这个错误:

./try.sh: line 3: is_odd 2: syntax error in expression (error token is "2")

我希望函数is_odd()的返回值作为索引传递给名为“type”的数组

请告诉我如何才能让它发挥作用。感谢。

1 个答案:

答案 0 :(得分:3)

我认为最好打印其结果,而不是让is_odd将结果作为状态代码返回:

is_odd()
{
    expr $1 % 2
}

然后您可以使用命令替换(`...`$(...))来获得结果:

echo -e $in " is an " ${type[$(is_odd $in)]} " number."

虽然说实话,在这个特定的情况下,我可能只是摆脱了函数并直接使用算术表达式 - 并且可能为了可读性而调整引用:

echo -e "$in is an ${type[in % 2]} number."

(请注意,双引号"..."不会阻止参数替换${...}。只有单引号'...'和反斜杠\才能执行此操作。另外,引号为{ {3}}指出数组索引自动被视为算术表达式,即使没有expr((...))或诸如此类的东西。)

那就是说,如果你真的想要将1换成“奇数”而将0换回“偶数”,那么首先,你应该将你的函数重命名为is_even(因为在Bash中) ,0表示“成功”或“真”,非零值表示“错误”或“假”),其次,您可以使用后续命令打印其返回值,然后使用命令替换。这些都应该有效:

echo -e "$in is an ${type[$(is_even $in ; echo $?)]} number."

echo -e "$in is an ${type[$(is_even $in && echo 0 || echo 1)]} number."

(顺便说一下,在上面的所有例子中,我也将a更改为an:在英语中,它是“奇数”,“偶数”。)