Bash: цикл while по нумерованным переменным

Убедитесь, что у вас установлены некоторые пакеты:

sudo apt-get install ntfsprogs ntfs-config

Если они у вас есть, но они по-прежнему не работают, попробуйте следующее:

sudo apt-get install ntfs-3g
0
19.03.2019, 19:28
4 ответа

Кажется, это работает:

for ((i=1;i<=3;i++)); do
    eval echo "$"$(eval echo Var${i}Value)
done

Там где-то шутят, что это ужасно eval...

1
28.01.2020, 02:14

Использовать ссылку на имя . Они работают как указатели на другие переменные (в Bash 4.3 и более поздних версиях ):

.
Var1Value=A
Var2Value=B
Var3Value=C
Var4Value=""

for (( i=1 ; ; i++ )); do
    n="Var${i}Value"                # the name of var
    declare -n p="$n"               # reference to the var
    [ "${p+x}" ] || break           # see if it exists
    echo "$n: '$p'"
done

"${p+x}"оценивается как x, если переменная, на которую указывает p, существует, так что это относится и к установленным, но пустым переменным.

В качестве альтернативы используйте косвенное расширение переменной ${!n}, которое ссылается на переменную, названную n.

for (( i=1 ; ; i++ )); do
    n="Var${i}Value"                # the name of var
    [ "${!n+x}" ] || break          # see if it exists
    echo "$n: '${!n}'"
done

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

VarValue=( A B C )

for value in "${VarValue[@]}"; do
    # use "$value" here
    printf 'Value is "%s"\n' "$value"
done

См. также:

5
28.01.2020, 02:14

Можно использовать цикл for, если известны переменные:

Пример:

#!/bin/bash

for i in var1 var2 var3
        do
           echo " This is $i"
           #More commands.
        done

выход

 This is var1
 This is var2
 This is var3
0
28.01.2020, 02:14

Чтобы проверить, установлена ​​ли переменная, см. Как проверить, существует ли переменная в операторе 'if'?([ -v "Var${i}Value" ](ksh/ zsh/bash)илиeval "[ -n \"\${Var${i}Value+set}\" ]"(POSIX )).

Теперь, чтобы перебрать переменные, имена которых соответствуют шаблону, в zshвы можете выполнить:

for varname in ${(Mk)parameters:#Var<->Value}; do
  something with "$varname" and its value: "${(P)varname}"
done

Чтобы обработать их в числовом порядке, добавьте флаг раскрытия параметра n(и измените MkнаMkn).

Сbash:

readarray -t list < <(compgen -v | grep -xE 'Var[[:digit:]]+Value')
for varname in "${list[@]}"; do
  something with "$varname" and its value: "${!varname}"
done

Или заменить readarrayна split+glob, чтобы избежать использования массива:

IFS=$'\n' # split on newline
for varname in $(compgen -v | grep -xE 'Var[[:digit:]]+Value'); do
  something with "$varname" and its value: "${!varname}"
done

Чтобы обработать их в числовом порядке и предполагая, что ваш sortявляется GNU sort, направьте вывод grepв sort -V.

1
28.01.2020, 02:14

Теги

Похожие вопросы