【问题标题】:Bash for loop with unique var names issue具有唯一变量名称的 Bash for 循环问题
【发布时间】:2021-10-08 00:02:52
【问题描述】:

我正在使用 bash for 循环来循环浏览目录并打印文件大小。我的问题是我需要为每个值分配一个唯一变量,以便以后可以使用它们,但是数组将所有数据作为数组中的一个元素输入。我已经尝试了双 for 循环和带有嵌套 for 循环的 if 语句,但没有得到正确的结果。 问题:如何修复以下代码以满足我的需求或有更好的方法?

declare -a byte
for b in /home/usr/frames/*
do
  byte+=$(wc -c < $b)
done 
declare -p byte

【问题讨论】:

  • 尝试使用关联数组,例如declare -A byte["$b"]=$(wc -c &lt; "$b") 而不是普通的数组索引数组。
  • @Jetchisel 这不是我想象的那样,但它确实有效,所以谢谢。如果您知道获取数组名称的方法,例如 f1、f2 等,请再次发布。声明 -A byte=([/home/joe/STENO/REAL/frames/frames7.png]="12853871" [/home/joe/STENO/REAL/frames/frames5.png]="12691609" [/home/乔/STENO/REAL/frames/frames8.png]="12869799" [/home/joe/STENO/REAL/frames/frames3.png]="12678175" [/home/joe/STENO/REAL/frames/frames1. png]="12618804" [/home/joe/STENO/REAL/frames/frames2.png]="12653975" [/home/joe/STENO/REAL/frames/frames6.png]="12698386" [/home/乔/STENO/REAL/frames/frames4.png]="12828883" )
  • 我已经编辑了答案,从路径名中提取文件名,不确定数组名,因为字节是关联数组的名称,array_name[key]=value

标签: bash for-loop variables


【解决方案1】:

OPs 原始代码的变体和 jetchisel 的回答:

unset byte
declare -A byte                                # -A == associative array

for b in /home/usr/frames/*
do
    byte[$(basename "${b}")]=$(wc -c < "${b}")
done 

declare -p byte

在我的主机上使用一些*.txt 文件:

$ pwd
/c/temp/cygwin
$ wc -c *.txt
 22 file.txt
405 somefile.txt
214 test.txt

使用修改后的for 子句:

unset byte
declare -A byte

for b in /c/temp/cygwin/*.txt
do
    byte[$(basename "${b}")]=$(wc -c < "${b}")
done 

declare -p byte

生成:

declare -A byte=([somefile.txt]="405" [test.txt]="214" [file.txt]="22" )

【讨论】:

    【解决方案2】:

    使用关联数组(如果可用)

    #!/usr/bin/env bash
    
    for b in /home/usr/frames/*; do
      declare -A byte["$b"]=$(wc -c < "$b")
    done
    

    使用Parameter Expansion 仅提取文件名。

    declare -A byte["${b##*/}"]=$(wc -c < "$b")
    

    现在检查byte的值

    declare -p byte
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-14
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多