Как поместить переменную среды в массив? - PullRequest
0 голосов
/ 13 марта 2020

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

Ответы [ 4 ]

2 голосов
/ 15 марта 2020

"${!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
2 голосов
/ 13 марта 2020

Для случаев, когда переменные среды могут содержать в своих значениях символы новой строки, вы можете использовать этот скрипт, который использует версии gnu printenv и awk.

mapfile -t arr < <(printenv -0 | awk -v RS='\0' -F= '/^DIR/{print $1}')

Затем проверьте содержимое массива как:

declare -p arr
0 голосов
/ 14 марта 2020
printenv   |  awk -F'=' '{if ($0 ~ /^DIR/) print $2; }'

Демо:

:-: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
:-:
0 голосов
/ 13 марта 2020

Мой ответ относится к написанной части вашего вопроса, где вы запрашиваете окружение переменных, поскольку из приведенного вами примера не ясно, являются ли рассматриваемые переменные на самом деле переменные среды или просто переменные оболочки.

Поскольку printenv предоставляет вам список переменных среды в виде NAME = VALUE обозначений, вы можете сделать

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

grep выбирает строки, начинающиеся с DIR , за которыми следует хотя бы один ди git. Настройте шаблон в соответствии со своими потребностями.

cut выбирает только левую часть знака равенства, то есть имя.

В этом решении предполагается, что у вас нет переменных среды, которые содержат встроенные переводы строк. В этом случае я предлагаю использовать язык программирования, который дает вам список переменных среды, которые вы можете изменить на oop. Perl, Ruby или Java.

...