Создавайте переменные и присваивайте значения через цикл (bash)

12

Есть ли способ создать переменные bash и присвоить им значения через цикл?

Что-то вроде:

#!/bin/bash

c=0
for file in $( ls ); do
    var"$c"="$file";
    let c=$c+1;
done

РЕДАКТИРОВАТЬ: Спасибо @Costas и @mdpc за указание, что это будет плохой альтернативой списку; вопрос только теоретический.

toxefa
источник
1
ПРИМЕЧАНИЕ. Имейте в виду, что ваша установка будет изменять / изменять / назначать переменные только в текущем процессе, а НЕ в родительском процессе, если вы выполняете это как команду. Вы можете получить файл, используя «.» команда (EX:. new_vars), чтобы это произошло в текущем процессе.
mdpc
Хорошо, но вышеописанное не работает на самом деле; var"$c"ломает это. Ответ @Costas демонстрирует, как назначить несколько значений одной переменной списка - я просто теоретически спрашиваю, могут ли переменные действительно генерироваться с помощью цикла.
Toxefa
Хммм ... почему так сложно, просто использование новой переменной создает ее без каких-либо фанфар.
mdpc

Ответы:

14

Ну, вы можете использовать eval следующим образом:

c=0
for file in $( ls ); do
    eval "var$c=$file";
    c=$((c+1));
done

Этот код создаст переменные с именем var0, var1, var2, ..., каждая из которых содержит имя файла. Я предполагаю, что у вас будет веская причина, по которой вы хотите сделать это, используя массив ...

Bichoy
источник
5

Возможно, вы имеете в виду массив. Есть несколько способов присвоить значения

Первый:

c=0
for file in $( ls ); do
    var[$c]="$file";
    c=$(($c+1));
done

Во-вторых:

c=0
for file in $( ls ); do
    var[c++]="$file";
done

Третий:

for file in $( ls ); do
    var[${#var}]="$file";
done

В-четвертых:

var=( $(ls) )

пятый

...

  1. нет необходимости использовать ls, просто положить *для всех файлов
  2. внутри знак может быть опущен[]$
Костас
источник
Спасибо; мой вопрос потенциально более теоретический, чем фактически практический. Однако, когда я echo $varс командами, которые вы перечислили выше, я получаю только первый файл в списке ls. Я делаю что-то неправильно?
Toxefa
1
Если вы хотите вывести весь массив, который вы должны использовать echo ${var[*]}(или ${var[@]}), один элемент можно назвать как echo ${var[1]}. Примечание: $varравно${var[0]}
Костас
1
@ py4on Другой способ - использовать цикл:for v in "${var[@]}";do echo $v;done
Костас