用shell获取内、外网IP地址 & 关于for循环的分隔符

(1)用shell获取:

内网IP地址

ifconfig -a | grep 'inet ' | cut -d ':' -f 2 |cut -d ' ' -f 1 | grep -v '^127'

外网IP地址

curl -s 'http://checkip.dyndns.org' | sed 's/.*Current IP Address:  [0-9\.]* .*//g'

 

(2)关于for循环中的分隔符:

当你用shell中的for循环来处理数据时:

for A in `cat /root/1.txt`
do
    echo $A
    # 其他处理代码
done

那么,如果文件 /root/1.txt 中的每一行中含有空格,那么输出的结果可能并不是你想像的那样。

你的愿意可能是要输出每一行并做其他处理,但由于换行符和空格都会被for循环作为分隔符,因此实际上变量A中存储的是更细的“段”,而不是每一行。

如果要一行一行处理,应该这样做:

cat /root/1.txt | while read S_LINE
do
    echo $S_LINE
    # 其他处理代码
done

这样,变量S_LINE中保存的就是每一行的内容了。

文章来源:http://www.codelast.com/

但是,使用上面的方法时,你要千万注意了,假设你有下面的代码:

COUNT=0
cat /root/1.txt | while read SIN
do
if [ true ]; then
    COUNT=$(($COUNT+1))
    echo "Here : $COUNT"
fi
done
 
echo "At last : $COUNT"

输出结果为:

Here : 1
Here : 2
Here : 3
Here : 4
At last : 0

怎么样,COUNT变量在循环中被逐次累加,而出了循环,其值却又变成了0!COUNT不是已经在前面定义过了吗,为什么在循环中被改变的值到最后又“复原”了呢?因为这里的重定向符“|”使得从while到done之间的部分成为了一个子shell,其中所更改的变量值不会影响外部的变量值,因此我们想要实现的“计数”效果没有达成。

有人说那要怎么做才可以在此基础上实现“计数”效果呢?可以这样做:

COUNT=0
while read SIN
do
if [ true ]; then
    COUNT=$(($COUNT+1))
    echo "Here : $COUNT"
fi
done < /root/1.txt
 
echo "At last : $COUNT"

文章来源:http://www.codelast.com/

你再试一下?绝对管用,输出结果为:

Here : 1
Here : 2
Here : 3
Here : 4
At last : 4

One thought on “用shell获取内、外网IP地址 & 关于for循环的分隔符

发表评论

电子邮件地址不会被公开。 必填项已用*标注