我有一个编译.bashrc文件的脚本。它测试某些命令是否可用。它生成如下变量:
command -v cheat 2>&1 >/dev/null
HAS_CHEAT=$?
command -v git 2>&1 >/dev/null
HAS_GIT=$?
如果设置了这些变量,脚本中的其他文件将执行或不执行某些操作。
我遇到的问题是,在加载 .bashrc 后,我的环境被这些变量污染了。我不想手动unset
每个变量。想知道是否有更好的方法可以做到这一点。
给变量一个唯一的前缀(如上面的"HAS_
"(,然后在最后运行以下命令:
unset "${!HAS_@}"
这种形式的间接展开(带有!
和@
(给出了一个变量列表,其名称以指定的前缀开头。
注意:我认为这不适用于 bash 以外的任何 shell。
您可以将变量封装在函数中并将它们声明为局部变量:
main() {
command -v git 2>&1 >/dev/null
local HAS_GIT=$?
}
main
在您的情况下,您可能根本不需要这些变量。如果你有一个if
,你可以写:
if command -v git 2>&1 >/dev/null; then
# case in which you have git
else
# case in which you don't have git
fi
如果您需要多个位置的状态代码,我会多次调用同一命令。这可能有点慢,但bash
一开始并没有那么快。另外,我发现if command
比if [ "$var" = 0 ]
更干净。
has() {
command -v "$@" 2>&1 >/dev/null
}
if has git; then
# case in which you have git
fi
# lots of code
if ! has git; then
# case in which you don't have git
fi
只是为了添加另一种可能的做事方式,你可以使用一个关联数组,它将把所有东西都放在一个地方,并防止用一堆单独的变量乱扔命名空间。
declare -A HAS=()
command -v cheat 2>&1 >/dev/null
HAS[CHEAT]=$?
command -v git 2>&1 >/dev/null
HAS[GIT]=$?
稍后使用这些值后,您可以只unset
整个数组:
unset HAS