问题
DIR1, DIR2, .... DIRN are coming from environment variables that contains some directory path. example
export DIR1="/users/abcd"
export DIR2="/users/abcd/xyz"
.
.
.
How do i know that how many DIR_ is in environment variable and put all these in the following array
arr=(DIR1 DIR2 ... . . DIRN)
i=0
while [ $i -lt ${#arr[@]} ]
do
cd ${arr[$i]}
i=`expr $i + 1`
done
回答1:
For the cases when environment variables may contain newlines in their values you can use this script that uses gnu versions of printenv
and awk
.
mapfile -t arr < <(printenv -0 | awk -v RS='\0' -F= '/^DIR/{print $1}')
Then check your array content as:
declare -p arr
回答2:
"${!prefix@}"
expands to the list of variable names that start with prefix
. In present circumstances, this can be used as follows:
#!/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
回答3:
My answer refers to the written part of your question, where you ask for environment variables, since from the example you gave, it is not clear whether the variables in question are really environment variables or mere shell variables.
Since printenv
gives you a list of environment variables in the form of NAME=VALUE denotations, you can do a
arr=($(printenv|grep '^DIR[0-9]'|cut -f 1 -d =))
The grep
picks the lines starting with DIR, followed by at least one digit. Adjust the pattern to your needs.
The cut
picks just the left part of the equal sign, i.e. the name.
This solution assumes that you don't have environment variables which contain embedded newlines. In this case, I suggest to use a programming language which gives you a list of environment variables you can loop over. Perl, Ruby or Java would do.
回答4:
printenv | awk -F'=' '{if ($0 ~ /^DIR/) print $2; }'
Demo :
:-:export DIR1="/users/abcd"
:-:export DIR2="/users/abcd"
:-:export DIR4="/usasders/abcd"
:-:printenv | awk -F'=' '{if ($0 ~ /^DIR/) print $2; }'
/usasders/abcd
/users/abcd
/users/abcd
:-:
来源:https://stackoverflow.com/questions/60666321/how-to-put-environment-variable-in-array