Tạo các biến và gán giá trị thông qua vòng lặp (bash)


12

Có cách nào để tạo các biến bash và gán giá trị cho chúng thông qua một vòng lặp không?

Một cái gì đó dọc theo dòng:

#!/bin/bash

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

EDIT: Cảm ơn bạn @Costas và @mdpc vì đã chỉ ra đây sẽ là một sự thay thế kém cho danh sách; Câu hỏi chỉ là lý thuyết.


1
LƯU Ý: Lưu ý rằng thiết lập của bạn sẽ thay đổi / sửa đổi / chỉ định các biến trong quy trình hiện tại và KHÔNG phải là quy trình cha nếu bạn thực hiện điều này như một lệnh. Bạn có thể nguồn tệp bằng cách sử dụng '.' lệnh (EX :. new_vars) để thực hiện điều này trong quy trình hiện tại.
mdpc

Ok, nhưng ở trên không thực sự hoạt động; var"$c"phá vỡ nó Câu trả lời của @Costas giải thích cách gán nhiều giá trị cho một biến danh sách - Tôi chỉ hỏi về mặt lý thuyết liệu các biến có thực sự được tạo bằng một vòng lặp hay không.
toxefa

Hmmm ... tại sao quá phức tạp, chỉ cần sử dụng một biến mới sẽ tạo ra nó mà không có bất kỳ sự phô trương nào.
mdpc

Câu trả lời:


14

Vâng, bạn hoàn toàn có thể sử dụng eval như sau:

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

Mã này sẽ tạo các biến có tên var0, var1, var2, ... với mỗi biến giữ tên tệp. Tôi giả sử bạn sẽ có một lý do chính đáng mà bạn muốn làm điều đó bằng cách sử dụng một mảng ...


5

Có thể bạn có nghĩa là mảng. Có một số cách để gán giá trị

Đầu tiên:

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

Thứ hai:

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

Ngày thứ ba:

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

Thứ tư:

var=( $(ls) )

Thứ năm

...

  1. không có nhu cầu sử dụng ls, chỉ cần đặt *cho tất cả các tập tin
  2. bên trong []các $dấu hiệu có thể được thông báo

Cảm ơn bạn; Câu hỏi của tôi có khả năng lý thuyết nhiều hơn thực tế. Tuy nhiên, khi tôi echo $varvới các lệnh bạn liệt kê ở trên, tôi chỉ nhận được tệp đầu tiên 'được liệt kê' bởi ls. Tôi có làm điều gì sai?
toxefa

1
Nếu bạn muốn xuất tất cả các mảng bạn phải sử dụng echo ${var[*]}(hoặc ${var[@]}), phần tử đơn có thể được gọi như thế echo ${var[1]}. Lưu ý: $varbằng nhau${var[0]}
Costas

1
@ py4on Cách khác là sử dụng vòng lặp:for v in "${var[@]}";do echo $v;done
Costas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.