Створення змінних та присвоєння значень за допомогою циклу (bash)


12

Чи є спосіб створити bash змінні та призначити їм значення за допомогою циклу?

Щось у напрямку:

#!/bin/bash

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

EDIT: Дякую @Costas та @mdpc за те, що вони вказали, що це буде поганою альтернативою списку; питання лише теоретичне.


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, ..., причому кожна з них містить ім'я файлу. Я припускаю, що у вас буде поважна причина, що ви хочете зробити це над використанням масиву ...


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
Costas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.