如何将环境变量放入数组中?

How to put environment variable in Array?

DIR1、DIR2、....DIRN 来自包含某些目录路径的环境变量。 例子

export DIR1="/users/abcd"
export DIR2="/users/abcd/xyz"
.
.
.

如何知道环境变量中有多少个DIR_并将这些都放在下面的数组中

arr=(DIR1 DIR2 ... . . DIRN)
i=0
while [ $i -lt ${#arr[@]} ] 
do
      cd ${arr[$i]}
      i=`expr $i + 1`
done

我的回答是指你问题的 written 部分,你在其中要求 environment 变量,因为从你给出的例子来看,目前尚不清楚所讨论的变量是真正的环境变量还是仅仅是 shell 个变量。

由于 printenvNAME=VALUE 表示形式为您提供环境变量列表,您可以执行

arr=($(printenv|grep '^DIR[0-9]'|cut -f 1 -d =))

grep 选取以 DIR 开头的行,后跟至少一位数字。根据您的需要调整图案。

cut只选取等号左边的部分,即名字。

此解决方案假定您没有包含嵌入式换行符的环境变量。在这种情况下,我建议使用一种编程语言,它为您提供可以循环的环境变量列表。 PerlRubyJava 都可以。

对于环境变量可能在其值中包含换行符的情况,您可以使用此脚本,该脚本使用 printenvawk.

的 gnu 版本
mapfile -t arr < <(printenv -0 | awk -v RS='[=10=]' -F= '/^DIR/{print }')

然后检查你的数组内容为:

declare -p arr
printenv   |  awk -F'=' '{if ([=10=] ~ /^DIR/) print ; }'

演示:

:-:export DIR1="/users/abcd"
:-:export DIR2="/users/abcd"
:-:export DIR4="/usasders/abcd"
:-:printenv   |  awk -F'=' '{if ([=11=] ~ /^DIR/) print ; }'
/usasders/abcd
/users/abcd
/users/abcd
:-:

"${!prefix@}" 扩展为以 prefix 开头的变量名称列表。在目前的情况下,可以这样使用:

#!/usr/bin/env bash
[ -n "$BASH_VERSION" ] || { echo "This must be run with bash, not /bin/sh" >&2; exit 1; }

arr=( )
for varname in "${!DIR@}"; do
  [[ $varname =~ ^DIR[[:digit:]]+$ ]] || continue ## skip DIRSTACK or other names that don't match
  arr+=( "${!varname}" )
done