在BASH中如何取消定义一个变量

8
为了节省时间,避免重复输入同一短语,我在BASH中定义了一些变量(不是bash文件,只是命令行bash)。可惜我把变量命名为foo1而不是foo。因此,我想要取消定义foo1
我知道可以将foo1设置为空并定义foo。但这样做会保留foo1,可能会造成混淆。我无法使用unset取消定义foo1,因为它不是环境变量。
问题:如何在BASH中取消定义一个变量?

3
不必在意 foo1 不是环境变量,你仍然可以使用 unset 命令将其取消设置。同时,我不确定您所说的 foo1 仍然存在是什么意思? - Reinstate Monica Please
@BroSlow 谢谢。我打错了 unset $foo1。我是一个粗心的初学者,感到惭愧。 - Peng Zhang
4
从技术上讲,不存在所谓的环境变量。所有的变量都是shell变量,其中一些可能被标记为导出到子进程。 “环境”变量只是在启动时基于在环境中找到的字符串创建的shell变量。 - chepner
3个回答

22

您只需要使用命令 unset

unset foo1

如果 foo1 不是环境变量也没关系。


为什么这个回答被投票下降了?我会添加“help unset”信息,但很明显这是一个好答案。 - Reinstate Monica Please
我认为这是因为你的评论和另一个人同时发布了,抱歉。 - Knut Holm
没问题。我觉得我们是同时在打字。这种情况在 Stack Overflow 上经常发生,绝对不是将正确答案投票下去的理由。不过看起来那个人已经删除了它。 - Reinstate Monica Please

2

如@BroSlow所评论的那样,是的,你需要使用unset

$ foo1=something
$ foo="something else"
$ set | grep ^foo
foo='something else'
foo1=something
$ unset foo1
$ set | grep ^foo
foo='something else'

我认为问题可能没有清晰地表达,但 OP 正在寻找一种避免 bash 将未定义的变量视为空的方法。 - Brian Cain
真的吗?尽管 OP 两次输入了“如何取消定义变量”? - glenn jackman
就像我说的那样,措辞不当。“我多么粗心啊,把一个变量命名为foo1而不是foo。所以,我想取消定义foo1。”除非OP想要节省调试问题时浪费的时间,否则这有什么用处呢?在这种情况下,“echo ${foo1}”不会停止执行,只会快乐地继续运行。 - Brian Cain

0

你可以使用 set -u 来"尝试使用未定义的变量输出错误消息,并强制退出"。

或者在 shebang 行中添加 -u,如下所示:

#!/usr/bin/bash -u

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接