首页 > 解决方案 > 循环遍历 bash 中的文件名数组并读取它们

问题描述

我有一个包含文件路径的数组。这些文件中的每一个都有一行。我想遍历数组,并为每个文件读取其中的行并将其存储在变量中。我试过这个

f1=$1
f2=$2
filenames[0]=${f1}
filenames[1]=${f2}
for filename in "${filenames[@]}"
do
  # get the filename
  set fl = `basename $filename`
  echo ${fl}
  # read its contents (one line)
  set filecontent = `cat ${fl}`
  echo ${filecontent}
done

两个回声都显示空格。如果我做

echo `basename $filename`

它确实显示文件名。上面的循环有什么问题?

标签: bashtcsh

解决方案


基本问题是您似乎在混合使用 bash 和 tcsh 语法 - 碰巧您使用的 tcsh 命令恰好不是 bash 中的语法错误,但没有做您想做的事。

这个:

set fl = `basename $filename`

是您如何设置$fl$filenametcsh 中的基本名称。然而,在 bash 中,set命令是完全不同的。由于它不是你需要在这里使用的东西,所以我不会详细介绍,但你可以在这里阅读它们。

在 bash 中,设置变量的方法就是

var=value  # NO spaces around the "="

此外,bash 与 tcsh 不同,$(command)除了旧的`command`.

所以你的命令

set fl = `basename $filename`

应该

fl="$("basename $filename")"

$filename在引用和命令替换周围添加双引号$(...)可确保 shell 可以处理文件名和/或命令输出中的奇数字符。


推荐阅读