Buat variabel dan tetapkan nilai melalui loop (bash)


12

Apakah ada cara untuk membuat variabel bash dan menetapkan nilai-nilai melalui loop?

Sesuatu di sepanjang garis:

#!/bin/bash

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

EDIT: Terima kasih kepada @Costas dan @mdpc untuk menunjukkan ini akan menjadi alternatif yang buruk untuk daftar; pertanyaannya hanya teoretis.


1
CATATAN: Perlu diketahui bahwa pengaturan Anda akan mengubah / memodifikasi / menetapkan variabel hanya dalam proses saat ini dan BUKAN proses induk jika Anda menjalankan ini sebagai perintah. Anda dapat sumber file menggunakan '.' perintah (EX:. new_vars) untuk membuat ini terjadi dalam proses saat ini.
mdpc

Oke, tetapi cara di atas tidak benar-benar berjalan; var"$c"istirahat itu. Jawaban @Costas menunjukkan bagaimana cara menetapkan beberapa nilai ke variabel daftar tunggal - Saya hanya bertanya secara teoritis apakah variabel sebenarnya dapat dihasilkan dengan satu loop.
toxefa

Hmmm ... kenapa begitu rumit, hanya menggunakan variabel baru membuatnya tanpa gembar-gembor.
mdpc

Jawaban:


14

Nah, Anda benar-benar dapat menggunakan eval sebagai berikut:

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

Kode ini akan membuat variabel bernama var0, var1, var2, ... dengan masing-masing memegang nama file. Saya berasumsi Anda akan memiliki alasan yang bagus untuk melakukannya daripada menggunakan array ...


5

Mungkin maksudmu array. Ada beberapa cara untuk menetapkan nilai

Pertama:

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

Kedua:

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

Ketiga:

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

Keempat:

var=( $(ls) )

Kelima

...

  1. tidak perlu digunakan ls, cukup masukkan *semua file
  2. di []dalam $tanda itu dapat dihilangkan

Terima kasih; pertanyaan saya berpotensi lebih teoretis daripada praktis. Namun, ketika saya echo $vardengan perintah yang Anda sebutkan di atas saya hanya mendapatkan file pertama 'terdaftar' oleh ls. Apakah saya melakukan sesuatu yang salah?
toxefa

1
Jika Anda ingin menampilkan semua array yang harus Anda gunakan echo ${var[*]}(atau ${var[@]}), elemen tunggal bisa disebut seperti echo ${var[1]}. Catatan: $varsama${var[0]}
Costas

1
@ py4on Cara lain adalah menggunakan loop:for v in "${var[@]}";do echo $v;done
Costas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.