我有一个包含文件路径的数组,每个文件都有一行。每一个文件都有一行。我想循环浏览这个数组,并为每一个文件读取其中的一行并将其存储在一个变量中。我尝试了这样的方法
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`
它确实显示了文件名。上面的循环有什么问题?
基本的问题是,你似乎把bash和tcsh语法混在一起了--只是碰巧你使用了tcsh命令,而这些命令在bash中恰好没有语法错误,但却没有达到你想要的效果。
这个。
set fl = `basename $filename`
就是你应该如何设置 $fl
的基名。$filename
在tcsh中。然而,在bash中, set
命令是完全不同的。反正你在这里也不需要用到,所以我就不细说了,但你可以阅读一下它们的内容。此处.
在bash中,设置一个变量的方法就是
var=value # NO spaces around the "="
另外,bash与tcsh不同,它有一个叫做 $(command)
语法来捕获命令的输出,除了旧的 `command`
.
所以你的命令
set fl = `basename $filename`
应是
fl="$("basename $filename")"
加双引号 $filename
参考文献和 $(...)
命令替换确保shell可以处理文件名和命令输出中的奇数字符。