在 bash 中如何打印所有以“A”开头且后跟一个或多个 [[:alnum:]] 的变量名?

在 bash 中如何打印所有以“A”开头且后跟一个或多个 [[:alnum:]] 的变量名?

对于文件名来说,这要归功于“路径名扩展”

ls ./A[[:alnum:]]*

我想编写一个 bash 脚本来打印所有以“A”开头且后跟一个或多个字母数字字符的变量名,例如

echo "A[[:alnum:]]+"

如果可能的话,我该如何通过指定字符类来实现这一点?

答案1

回答 Mahim,2022 年 12 月 20 日 19:30

非常感谢。我不知道新的 bash 参数扩展

${!prefix*}
${!prefix@}

Bash 手册页上说:与前缀匹配的名称。扩展为名称以前缀开头的变量的名称,由 IFS 的第一个字符分隔

这是仅基于 bash 的解决方案的关键。

但是我无法理解您的其他解释。此命令中的“!”与正则表达式无关。

现在我能够开发一个仅使用 bash 的解决方案。它在下面几行中给出。

这是本示例中用于测试的两个变量:

declare A_notfollowedbyalnum=1
declare Afollowedbyalnum=1

代码如下:

WE_prefix="A"; WE_IFS_saved="$IFS"; IFS=$'\n'; eval WEx=\${!"$WE_prefix"@}; IFS="$WE_IFS_saved"; for WEx_x in $WEx; do if [[ "$WEx_x" =~ $WE_prefix[[:alnum:]]+ ]]; then WEy_x="${BASH_REMATCH[0]}"; printf '~%s~\n' "$WEy_x"; fi; done;

输出为:

~Afollowedbyalnum~

问候

答案2

解决办法很简单,我也曾经用过(但是一时之间忽略了):

set | grep -Ee "\<A[[:alnum:]]+"

或者

env | grep -Ee "\<A[[:alnum:]]+"

然而,我感兴趣的是,是否有一种方法可以使用 bash 本身,而不需要 grep。

相关内容