将命令的输出附加到 Bash 中的变量

问题描述 投票:0回答:2

我正在尝试将命令的输出附加到 Bash 中的变量。我的代码是

#!/bin/bash

for file in *
do
    lineInfo=`wc -l $file`
    echo "$lineInfo"
done

我了解如何将命令的输出“捕获”到变量,就像我在这一行中使用反引号所做的那样。

lineInfo=`wc -l $file`

有没有一种简洁的方法可以将整个 for 循环的输出放入 Bash 中的变量中?或者在 for 循环的每次迭代中将 wc 命令的输出附加到linesInfo 中? (不将任何内容重定向到文件)谢谢。

bash scripting
2个回答
3
投票

这会将所有行信息(以逗号分隔)存储到一个变量中并打印该变量:

#!/bin/bash

total=""

for file in *
do
    lineInfo=`wc -l $file`
    total="$total$lineInfo, "  # or total+="$lineInfo, "
done

echo $total

0
投票

您可以将整个循环放入命令替换中:

linesinfo=$(for file in *; do
        wc -l $file; done)

但是,当然,

wc
可以让您在多个文件上运行它:

linesinfo=$(wc -l *)

虽然输出是相当机器可读的,但现代 Bash 中更好的方法可能是将每个结果分配给关联数组中的新元素。

declare -A linesinfo

for file in *; do
    linesinfo["$file"]=$(wc -l <"$file")
done

有点令人惊讶的是,使用

"${!linesinfo[@]}"
循环按键。

for file in "${!linesinfo[@]}"; do
    echo "'$file' size ${linesinfo[$file] bytes"
done

演示: https://ideone.com/FMGUyM

关联数组在 Bash v3 中不可用,因此这在 MacOS 上无法开箱即用,MacOS 仍然附带非常旧的 Bash 版本。

请注意,通过重定向运行

wc
如何仅生成实际行数(而
wc -l "$file"
会生成类似带有前导空格的
  42 filename.txt
之类的内容)。

© www.soinside.com 2019 - 2024. All rights reserved.