我有一个编译.bashrc文件的脚本。它测试某些命令是否可用。它会生成如下变量:
command -v cheat 2>&1 >/dev/null
HAS_CHEAT=$?
command -v git 2>&1 >/dev/null
HAS_GIT=$?
如果设置了这些变量,脚本中的其他文件将采取或不采取某些措施。
我遇到的问题是,在加载.bashrc之后,我的环境被这些变量污染了。我不想手动unset
每个变量。想知道是否有更好的方法。
答案 0 :(得分:3)
为变量提供一个唯一的前缀(例如上面的“ HAS_
”),然后最后运行:
unset "${!HAS_@}"
这种形式的间接扩展(使用!
和@
)提供了一个变量列表,其名称以指定的前缀开头。
注意:除了bash之外,我认为这无法在任何shell中使用。
答案 1 :(得分:2)
您可以将变量封装在函数中,然后将其声明为本地变量:
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
答案 2 :(得分:0)
只需添加另一种可能的处理方式,您就可以使用关联数组,该数组将所有内容保留在一个位置,并防止使用一堆单独的变量乱丢命名空间。
declare -A HAS=()
command -v cheat 2>&1 >/dev/null
HAS[CHEAT]=$?
command -v git 2>&1 >/dev/null
HAS[GIT]=$?
然后在使用完这些值后,您可以unset
整个数组:
unset HAS