遍历 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 命令输出中的奇数字符。
我有一个包含文件路径的数组。这些文件中的每一个都有一行。 我想遍历数组,并为每个文件读取其中的行并将其存储在一个变量中。 我试过了
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 命令输出中的奇数字符。