好的,基本上我希望能够使用这种格式的文本文件:
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`
但当我回应变量时,我得到的是:
[
[
[
我似乎无法弄清楚如何解决这个问题。
答案 0 :(得分:3)
请改用此模式:
while read line ; do
... loop body ...
done < "$file_name"
说明:for var in word-list
将按顺序将列表中的单词分配给变量。因此,对于第一个循环,$line
将扩展为[
(列表中的第一个单词)。下一个单词是cat
,然后是file_name
的值。
要从文件中读取,您需要使用I/O redirection。
另一方面, while
将执行您作为参数传递的命令(read line
)。 read
将从stdin
读取一行,并将值放入您作为参数传递的变量中。
奇数done < $file_name
设置stdin
以供阅读。为了让您的生活更加简单,您可以使用read
为您分割输入:
while read website port id ; do
...
答案 1 :(得分:2)
while read WEBSITE PORT IP
do
echo $WEBSITE $IP $PORT ;
done < file
但是在循环结束后你将无法使用这些变量。
答案 2 :(得分:2)
for
默认情况下不会逐行读取,而是读取由$ IFS分隔的标记。默认情况下,IFS通常包含空格,制表符和换行符。如果你想强制bash逐行读取(而不是以空格分隔的标记),你可以这样做:
IFS=`echo -ne '"\n"'`; for line in `cat $file`; do echo $line; done
请注意围绕cat $file
执行cat
'内联'的反引号。
使用read
是另一种选择。当然比更改IFS(内部字段分隔符)