我将如何在 Bash 中获取局部和全局变量的值,跳过任何函数和环境变量?
declare -p
给了我整堆。但不清楚我是否可以依赖declare -p
.从help declare
输出中也不清楚是否declare -p
可以包含函数。实验表明事实并非如此。
示例:有些变量的输出类似于:
declare -- VARNAME="Variable value"
declare
...以及其他给出选项而不是 的选项--
,例如:
declare -ir UID="197609"
现在,如果我知道我可以依赖这种格式来输出declare
,我可以简单地使用while
类似于此的循环来将输出限制为只读整数变量:
while read -r decl opts keyval; do
if [[ "$opts" == *ir* ]]; then # could obviously also be case/esac
echo "$keyval"
fi
done < <(declare -p)
...从而清除我不感兴趣的变量类型。
问题:但能我靠,是这样吗?如果没有的话还有什么简洁的是否存在按某些给定标准过滤变量的方法?
注意:我对 Bash >=5.0 感兴趣,目前我的机器上使用的是 5.2.15。
答案1
typeset
您可以使用/查询变量的类型declare
-p
。+F
排除函数,并且通过环境设置的变量标记为-x
,因此我们可以用正则表达式来解决这个问题:
declare -p +F | grep -Ev '^declare -x'
您是否只需要名称:
declare -p +F | sed -n 's/^declare -[^x] \([^=]*\).*/\1/p'
答案2
在bash
:
comm -23 -- <(compgen -v | sort) <(compgen -e | sort)
其中从所有变量列表中comm
减去导出的变量。e
v
和zsh
:
set -o extendedglob
print -roC1 -- ${(k)parameters[(R)^*export*]}
$parameters
是一个特殊的关联数组,它将参数名称映射到其类型和属性列表。
在这里,我们print
在列上排序了该r
关联数组的值不包含的值。o
1
C
k
export
您可能还想排除special
、hide
或undefined
(准备自动加载)。