你如何在bash函数中使用局部变量?

时间:2016-10-26 06:25:04

标签: bash sh alias

我有一张所有反人类卡白卡的测试清单。我的目标是输入密码卡并从caghw.txt文件中获取随机卡的字符串。因此,如果212是随机数,则打印行212。这就是我在.bashrc中的内容:

rancard ()
{
    card=echo $((1 + RANDOM % 706))

    #I'm trying to take the random value returned from
    #the math function above and use it as an argument
    #to the head command

    head -$card /root/caghw.txt | tail -1
}

我做错了什么?我知道我有一般的想法,但对语法不太熟悉。

作为免责声明,这不适用于学校或其他任何事情。这是我自己的娱乐。

2 个答案:

答案 0 :(得分:2)

执行:

card=$((1 + RANDOM % 706))

这里我们将算术扩展的输出$((1 + RANDOM % 706))保存在变量card中。如果您想要保存命令替换的输出$(),请执行相同操作。

如果使用命令替换$()包装命令,那么你的工作就可以了。

card=$(echo $((1 + RANDOM % 706)))

这是绝对不必要的,并且冗余,因为保存算术扩展的输出将如上所示。

所以你的函数可以采用以下最终形式:

rancard () {
    card=$((1 + RANDOM % 706))
    head -"$card" /root/caghw.txt | tail -1
}

或者如果您想将变量card置于本地,请使用local关键字:

rancard () {
    local card=$((1 + RANDOM % 706))
    head -"$card" /root/caghw.txt | tail -1
}

答案 1 :(得分:1)

在已经给出的答案旁边,我会优化您的功能,只需使用head即可删除tailsed命令:

sed -n "$((1 + RANDOM % 706))p" /root/caghw.txt

-n是删除sed默认执行的自动行式打印。 p表示打印由$((...))

计算的行号