在 Bash 中临时声明一个变量

在 Bash 中临时声明一个变量

要在 Bash 中声明变量,例如在 Bash 脚本文件(不包括 Bash 函数)中,我会这样做x=y,当我在该脚本文件中使用完它时,我会这样做unset x

有没有一种方法(不使用函数)在 5 分钟后取消设置变量,两者都在一行中?一个可行的方法可能是x=y && echo "unset x" | at now + 5 minutes

在这种特殊情况下,我直接在终端中运行脚本文件复制粘贴其内容从 GitHub 到终端。这属于采购我假设”。


鉴于我使用 GitHub,另一种选择可能是执行原始版本直接从 GitHub 中使用单独的 shell 编写脚本文件,bash如下所示,但我不喜欢这种方式,因为它不能是user/repo/branch/path/file不可知的:

wget -O - https://raw.githubusercontent.com/<username>/<repo>/<branch>/<path>/<file> | bash

答案1

您无法使用at作业,因为它们在不同的上下文中运行,并且不会影响当前的 shell。

但我们可以做类似的事情。此代码将触发警报信号,我们可以捕获该信号并对其执行操作

#!/bin/bash

x=100

trap 'unset x' SIGALRM

mypid=$$

( /bin/sleep 3 ; kill -ALRM $mypid) &

for a in 1 2 3 4 5 6
do
  echo Now x=$x
  sleep 1
done

这个例子仅用3秒的时间来演示解决方案;您可以根据需要选择延迟。

行动中:

Now x=100
Now x=100
Now x=100
Now x=
Now x=
Now x=

您可以轻松地使其成为一行;...

答案2

当然:

trap 'unset x; trap - USR1' USR1; { sleep 5m; kill -USR1 $$; } &

这会在 USR1 信号上设置一个陷阱,然后(用分号作弊将其放在一行上)将 sleep 和 Kill 命令组合到后台作业中。当该作业完成时,它将向当前 shell 发送 USR1 信号,该 shell 将执行陷阱。陷阱会解除x,然后清除陷阱。

没有功能!

答案3

对于您修改后的问题,基于命令行而不是脚本,您最简单的解决方案是使用子外壳做你的工作。

例如

$ bash
$ x=100
$ echo $x
100
$ exit
$ echo $x

$

bash您在运行和调用该 shell之间设置的所有变量都exit将被忘记。

这与该部件的工作方式非常接近wget ... | bash,除了您可以剪切“粘贴”/键入命令。

答案4

实际上,最简单的方法可能是仅使用在开头带有变量声明的复合命令。

如果在命令行开头声明变量,则仅在该命令的范围内临时定义该变量。

madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y bash -c 'echo $x'
y
madumlao@lezard:~$ echo $x
foo

正如您所看到的,带有变量声明的行仅在该行的环境中设置变量。

请注意,以下内容将不起作用:

madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y echo $x

madumlao@lezard:~$ echo $x
foo

第二行中的 $x 是在命令行解析期间解析的,在实际赋值之前,所以它意外地为空!

相关内容