我将如何在 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。
typeset
您可以使用/查询变量的类型declare
-p
。+F
排除函数,并且通过环境设置的变量被标记为-x
,因此我们可以正则表达式解决这个问题:你应该只需要名字:
在
bash
:其中从所有变量的列表中
comm
减去xported 变量。e
v
与
zsh
:$parameters
是一个特殊的关联数组,它将参数名称映射到它们的类型和属性列表。print
在这里,我们r
aw在值不包含的关联数组的 ey上o
排序。1
C
k
export
您可能还想排除
special
,hide
, 或undefined
(准备自动加载)那些。