创建变量并通过循环(bash)分配值


12

有没有一种方法可以创建bash变量并通过循环为它们分配值?

类似于以下内容:

#!/bin/bash

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

编辑:感谢@Costas和@mdpc指出这将是列表的替代方案;这个问题只是理论上的。


1
注意:请注意,如果您将其作为命令执行,则设置将仅在当前进程中更改/修改/分配变量,而不会在父进程中更改/分配变量。您可以使用“。”作为文件来源。命令(EX:。new_vars)使其在当前进程中发生。
mdpc

好的,但是上面的命令实际上无法运行;var"$c"打破它。@Costas的答案演示了如何将多个值分配给单个列表变量-我只是在理论上问变量是否实际上可以通过循环生成
toxefa 2015年

嗯...为什么这么复杂,只使用一个新变量就可以毫不夸张地创建它。
mdpc

Answers:


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 2015年

1
如果要输出所有必须使用echo ${var[*]}(或${var[@]})的数组,则可以将单个元素称为echo ${var[1]}。注意:$var相等${var[0]}
Costas

1
@ py4on其他方法是使用循环:for v in "${var[@]}";do echo $v;done
Costas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.