如何将环境变量放入数组中?
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 个变量。
由于 printenv
以 NAME=VALUE 表示形式为您提供环境变量列表,您可以执行
arr=($(printenv|grep '^DIR[0-9]'|cut -f 1 -d =))
grep
选取以 DIR 开头的行,后跟至少一位数字。根据您的需要调整图案。
cut
只选取等号左边的部分,即名字。
此解决方案假定您没有包含嵌入式换行符的环境变量。在这种情况下,我建议使用一种编程语言,它为您提供可以循环的环境变量列表。 Perl、Ruby 或 Java 都可以。
对于环境变量可能在其值中包含换行符的情况,您可以使用此脚本,该脚本使用 printenv
和 awk
.
的 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
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 个变量。
由于 printenv
以 NAME=VALUE 表示形式为您提供环境变量列表,您可以执行
arr=($(printenv|grep '^DIR[0-9]'|cut -f 1 -d =))
grep
选取以 DIR 开头的行,后跟至少一位数字。根据您的需要调整图案。
cut
只选取等号左边的部分,即名字。
此解决方案假定您没有包含嵌入式换行符的环境变量。在这种情况下,我建议使用一种编程语言,它为您提供可以循环的环境变量列表。 Perl、Ruby 或 Java 都可以。
对于环境变量可能在其值中包含换行符的情况,您可以使用此脚本,该脚本使用 printenv
和 awk
.
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