在 Bash 中仅获取全局和局部 shell 变量(不是函数或环境变量)的简洁方法

在 Bash 中仅获取全局和局部 shell 变量(不是函数或环境变量)的简洁方法

我将如何在 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减去导出的变量。ev

zsh

set -o extendedglob
print -roC1 -- ${(k)parameters[(R)^*export*]}

$parameters是一个特殊的关联数组,它将参数名称映射到其类型和属性列表。

在这里,我们print在列上排序了该r关联数组的值不包含的值。o1 Ckexport

您可能还想排除specialhideundefined(准备自动加载)。

相关内容