我正在尝试将命令的输出附加到 Bash 中的变量。我的代码是
#!/bin/bash
for file in *
do
lineInfo=`wc -l $file`
echo "$lineInfo"
done
我了解如何将命令的输出“捕获”到变量,就像我在这一行中使用反引号所做的那样。
lineInfo=`wc -l $file`
有没有一种简洁的方法可以将整个 for 循环的输出放入 Bash 中的变量中?或者在 for 循环的每次迭代中将 wc 命令的输出附加到linesInfo 中? (不将任何内容重定向到文件)谢谢。
这会将所有行信息(以逗号分隔)存储到一个变量中并打印该变量:
#!/bin/bash
total=""
for file in *
do
lineInfo=`wc -l $file`
total="$total$lineInfo, " # or total+="$lineInfo, "
done
echo $total
您可以将整个循环放入命令替换中:
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
关联数组在 Bash v3 中不可用,因此这在 MacOS 上无法开箱即用,MacOS 仍然附带非常旧的 Bash 版本。
请注意,通过重定向运行
wc
如何仅生成实际行数(而 wc -l "$file"
会生成类似带有前导空格的 42 filename.txt
之类的内容)。