遍历 bash 中的文件名数组并读取它们

Looping through array of filenames in bash and read them

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

f1=
f2=
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`

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

基本问题是您似乎在混合使用 bash 和 tcsh 语法 — 只是碰巧您使用的 tcsh 命令恰好不是 bash 中的语法错误,而是不要为所欲为。

这个:

set fl = `basename $filename`

是您在 tcsh 中将 $fl 设置为 $filename 的基本名称的方式。然而,在 bash 中,set 命令是完全不同的。因为这不是你需要在这里使用的东西,所以我不会详细介绍,但你可以阅读它们here

在bash中设置变量的方式就是

var=value  # NO spaces around the "="

此外,bash 与 tcsh 不同,除了较旧的 `command`.

之外,还有一个 $(command) 语法来捕获命令的输出

所以你的命令

set fl = `basename $filename`

应该是

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

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