如何创建像$ RANDOM这样的bash变量

时间:2015-04-06 00:20:39

标签: linux bash

我对某件事感兴趣:每次echo $RANDOM,显示价值差异。我猜RANDOM是特殊的(当我读它时,它可以调用一个函数,设置一个变量标志并返回RANDOM数字。)。我想创建一个这样的变量,我该怎么做?每个答案都会有所帮助。

3 个答案:

答案 0 :(得分:1)

如果你是BASH脚本,那么BASH内部就有一个$ RANDOM变量。 这篇文章解释了随机变量$ RANDOM:

http://tldp.org/LDP/abs/html/randomvar.html

它会生成0到32767之间的数字。

如果你想做不同的事情,那就这样:

case $RANDOM in
[1-10000])
  Message="All is quiet."
  ;;
[10001-20000])
  Message="Start thinking about cleaning out some stuff.  There's a partition that is $space % full."
  ;;
[20001-32627])
  Message="Better hurry with that new disk...  One partition is $space % full."
  ;;
esac

答案 1 :(得分:1)

$RANDOM的特殊行为是bash的内置功能。没有用于定义自己的特殊变量的机制。

您可以编写一个函数,在每次调用时打印不同的值,然后将其作为$(func)调用。例如:

now() {
    date +%s
}

echo $(now)

或者您可以将$PROMPT_COMMAND设置为更新指定变量的命令。它在打印每个提示之前运行。

i=0
PROMPT_COMMAND='((i++))'

这在脚本中不起作用(因为没有打印提示),无论你是否引用变量,它都会产生开销。

答案 2 :(得分:1)

前一段时间我偶然发现了这个问题并且不满意接受的答案:他想创建一个变量,就像$RANDOM(一个具有动态值的变量),因此我想知道我们是否可以在不修改bash本身的情况下完成。

$RANDOM之类的变量是由bash使用struct variabledynamic_value字段在内部定义的。如果我们不想修补bash来添加我们的自定义“动态值”变量,我们仍然没有其他选择。

bash的一个模糊特征是loadable builtins(在运行时加载了shell内置函数),提供了一种通过enable函数动态加载新符号的便捷方法:

$ enable --help|grep '\-f'
enable: enable [-a] [-dnps] [-f filename] [name ...]
      -f        Load builtin NAME from shared object FILENAME
      -d        Remove a builtin loaded with -f

我们现在必须编写一个可加载的内置函数,提供我们希望用作变量dynamic_value的函数(用C编写),然后使用指向变量的指针设置变量的dynamic_value字段。选择的功能。

这样做的生产就绪方法是使用另一个可加载的内置工具来实现繁重的工作,但是如果gdb调用可以执行相同操作,可能会滥用ptrace

我使用gdb制作了a little demo,回答“如何创建像$RANDOM这样的bash变量?”

$ ./bashful RANDOM dynamic head -c 8 /dev/urandom > /dev/null
$ echo $RANDOM
L-{Sgf