1. 解读这两个程序是因为程序中包含了大部分shell脚本的语法;
2. 省去以后需要使用到shell脚本的时候,需要参考的需求;
1 #!/bin/bash
2 # Author: Joshua Chen
3 # Date: Jun 2014
4 # Location: Shenzhen
5
6 #1. 解读这两个程序是因为程序中包含了大部分shell脚本的基本语法;
7 #2. 省去以后需要使用到shell脚本的时候,需要参考的需求;
8 #3. 在本代码中,以24位掩码为基准,如果IP为: 10.1.1.7,那么前面三位数是网络位: 10.1.1,最后一位是主机位: 7
9 # 2015-3-28 晴 深圳 曾剑锋
10
11
12 # Description: allocate IPs to students
13
14 #每个人分配一个主IP, 3个辅助IP
15 EXTRA_COUNT=3
16 #IP的前缀,相当这个脚本用于分配10.1.1段的IP,也就是网络位
17 IP_PREFIX=10.1.1
18 #最多分配50个主IP
19 MAX_GRP=50
20 #主IP的主机位从11开始
21 PRIM_MIN=11
22 #主IP的主机位最大值
23 PRIM_MAX=$((PRIM_MIN + MAX_GRP -1))
24 #扩展IP的主机位最小值
25 EXTRA_MIN=$((PRIM_MAX + 1))
26 #扩展IP的主机位最大值
27 #EXTRA_MAX=$((EXTRA_MIN + MAX_GRP * EXTRA_COUNT -1))
28
29 #获取传入的第一个参数,如果文件不存在,那个就退出,
30 #并且打印出命令的使用方法.
31 list=$1
32 if [ ! -e "$list" ];then
33 #输出到标准错误输出
34 echo "Can not locate list file '$list'" >&2
35 #需要传入有学生姓名的文件,每个学生名字占一行
36 echo "Usage: $(basename $0) <name list>"
37 exit 1
38 fi
39
40 #检查list路径下文件的行数是否大于MAX_GRP,以下提供2种写法
41 #if [ $(wc -l "$list" | cut -d " " -f1) -gt "$MAX_GRP" ];then
42 if [ $(wc -l < "$list") -gt "$MAX_GRP" ];then
43 echo "Too many entries in the name list! maximum $MAX_GRP is allowed" >&2
44 exit 1
45 fi
46
47 #分配主IP
48 #每次从list代表的文件中读取一行名字,保存在name的变量中,
49 #然后是用printf组合分配IP.
50 echo "------- Primary IP -------"
51 n=$PRIM_MIN
52 while read name
53 do
54 printf "%s.%-3s %s\n" "${IP_PREFIX}" $n "$name"
55 ((n++)) #语法要求,这样就可以像写C一样
56 done < "$list"
57
58 #分配辅助IP
59 #因为辅助IP这里需要分配3个,所以while里面再是用for循环
60 #对IP进行分配.
61 echo
62 echo "------- Extra IP -------"
63 n=$EXTRA_MIN
64 while read name
65 do
66 for i in $(seq $EXTRA_COUNT) #seq用于产生序列供for循环使用
67 do
68 printf "%s.%-3s %s\n" "${IP_PREFIX}" $n "$name"
69 ((n++))
70 done
71 done < "$list"
72
73 #退出程序
74 exit 0
75
76
77 # Description: detect the ethernet link state
78
79 #网卡设备所在的目录
80 dir=/sys/class/net
81 #文件名carrier
82 file=carrier
83
84 # need root privilege
85 if [ "$UID" -ne 0 ]; then
86 echo "Must be root"
87 exit 1
88 fi
89
90 if [ ! -d $dir ];then
91 echo "Directory $dir doesn't exist, quit."
92 exit 1
93 fi
94
95 cd $dir
96
97
98 # do we have an NIC? #Network Interface Card
99 if ! ls | grep -q ^eth; then
100 echo "No NIC detected"
101 exit 1
102 fi
103
104 # check the status of each NIC
105 ls | grep ^eth | while read dev
106 do
107 # take it up first
108 ifconfig $dev up &> /dev/null
109
110 # if the file is not found and put error to /dev/null
111 if [ "$(cat $dev/$file 2>/dev/null)" = "1" ];then
112 echo "$dev: link ok"
113 else
114 echo "$dev: no link"
115 fi
116 done
117
118 exit 0