1

好的,基本上我希望能够使用这种格式的文本文件:

www.website.com 443 123.456.789.098
www.website2.com 443 765.432.101.234
....

作为输入源,脚本将获取网站地址并将其保存在变量中,并且与端口和 IP 地址相同。所以它看起来像这样:

website=www.website.com
port=443
ip=123.456.789.098

到目前为止,我已经尝试过这个:

for line in [ cat $file_name ]; do
    website=`echo $line | cut -d" " -f1`
    port=`echo $line | cut -d" " -f2`
    ip=`echo $line | cut -d" " -f1`

但是当我回显变量时,我得到的只是:

[
[
[

我似乎无法弄清楚如何解决这个问题。

4

3 回答 3

3

请改用此模式:

while read line ; do
    ... loop body ...
done < "$file_name"

解释:for var in word-list将列表中的单词按顺序分配给变量。所以对于第一个循环,$line将扩展为[(列表中的第一个单词)。下一个词是cat,然后是 的值file_name

要从文件中读取,您需要使用I/O 重定向

while另一方面,将执行您作为参数 ( read line) 传递的命令。read将从中读取一行stdin并将值放入您作为参数传递的变量中。

奇数done < $file_name设置stdin为读取。为了让您的生活更加简单,您可以使用read为您拆分输入:

while read website port id ; do
    ...
于 2012-07-03T12:45:37.700 回答
2
while read WEBSITE PORT IP
do 
    echo $WEBSITE $IP $PORT ; 
done < file

但循环结束后,您将无法使用此变量。

于 2012-07-03T12:50:55.633 回答
2

for默认情况下不逐行读取,而是读取由 $IFS 分隔的标记。默认情况下,IFS 通常包含空格、制表符和换行符。如果你想强制 bash 逐行读取(而不是空格分隔的标记),你可以这样做:

IFS=`echo -ne '"\n"'`; for line in `cat $file`; do echo $line; done

请注意周围的反引号cat $file将执行cat“内联”。

使用read是另一种选择。当然比更改IFS(内部场分离器)更容易阅读和理解

于 2012-07-03T13:03:17.723 回答