linux小测试
###张小强
>**`作业答案`**
- 1.写一个脚本
```
(1) 接受一个以上文件路径作为参数,一个路径或多个路径作为参数;
(2) 显示每个文件拥有的行数;
(3) 并且说明一共统计了有多少文件,且一共多少行;
```
```
if [ $# -lt 1 ];then
echo " $0 PATH1 PATH2.... "
exit 1
fi
declare -i line
declare -i lines=0
declare -i FILE_NUMS=0
PATH_NUMS=$#
# 这里的注意点在于:使用变量去参数名需要这里来取:${!i} == $1 == 参数1
for i in `seq $PATH_NUMS`; do
if [ -e ${!i} ];then
line=$(wc -l ${!i} | cut -d" " -f1)
lines=$[ $lines+$line ]
let FILE_NUMS++
echo -e "\E[1;33m${!i}有$line行 \033[0m"
else
echo -e "\E[1;31m${!i}不存在 \033[0m"
fi
done
echo -e "\E[1;33m一共统计了$FILE_NUMS个文件,一共$lines行 \033[0m"
```
- 2.写一个脚本
```
(1) 传递两个以上的字符串当作用户名,可以是3个也可以是多个哦,不限于两个哦;
(2) 创建这些用户;且密码同用户名;
(3) 统计一共创建了几个用户;
```
```
#!/bin/bash
# (1) 传递两个以上字符串当作用户名;
# (2) 创建这些用户;且密码同用户名;
# (3) 总结说明共创建了几个用户;
if [ $# -lt 2 ];then
echo "请输入两个以上的用户名作为参数"
exit 1
fi
declare -i USER_NUMS=0
ARGS=$#
for i in `seq $ARGS`; do
if id ${!i} &> /dev/null;then
# 如果用户存在
echo -e "\E[1;31m用户${!i}存在 \033[0m"
else
# 如果用户不存在
useradd ${!i}
echo "${!i}" | passwd --stdin ${!i} &> /dev/null
let USER_NUMS++
echo -e "\E[1;33m创建用户${!i} \033[0m"
fi
done
echo -e "\E[1;34m一共创建了$USER_NUMS \033[0m"
```
- 3、写一个脚本
```
(0)给脚本传递两个数值用于指定用户的范围,例如:1 20 则创建20个用户 或 101 200 则创建100个用户
(1)批量新建用户,如:student1---student20, 或 student101---student200;
(2)密码与用户名相同;
(3)如果用户已经存在就不统计其UID,并给出提示
(4)计算新建用户的UID之和;
```
```
#!/bin/bash
# (0)给脚本传递两个数值用于指定用户的范围,例如:1 20 则创建20个用户 或 101 200 则创建100个用户
# (1)批量新建用户,如:student1---student20, 或 student101---student200;
# (2)密码与用户名相同;
# (3)如果用户已经存在就不统计其UID,并给出提示
# (4)计算新建用户的UID之和;
declare -i ID
declare -i ID_SUM=0
for i in `seq $1 $2`; do
if id student$i &> /dev/null ;then
# 如果用户存在
echo -e "\E[1;31m用户student$i已经存在 \033[0m"
else
useradd student$i
echo "student$i" | passwd --stdin student$i &> /dev/null
ID=$(id -u student$i)
ID_SUM=$[ ID_SUM+ID ]
echo -e "\E[1;34m创建了用户student$i \033[0m"
fi
done
echo -e "\E[1;33m用户的UID之和为:$ID_SUM \033[0m"
```
- 4、写一个脚本
```
(1)分别统计/etc/rc.d/rc.sysinit、/etc/rc.d/init.d/functions和/etc/fstab文件中以#号开头的行数之和,以及总的空白行数;
```
```
#!/bin/bash
# 分别统计/etc/rc.d/rc.sysinit、/etc/rc.d/init.d/functions和/etc/fstab文件中以#号开头的行数之和,以及空白行数之和;
declare -i Line1=0
declare -i Line2=0
for file in /etc/rc.d/rc.sysinit /etc/rc.d/init.d/functions /etc/fstab; do
Line1=$[ $Line1+$(egrep "^#" $file | wc -l) ]
Line2=$[ $Line2+$(egrep "^[[:space:]]*$" $file | wc -l) ]
done
echo -e "\E[1;33m#号开头的行数之和为:$Line1\033[0m"
echo -e "\E[1;31m空白行数之和:$Line2\033[0m"
```
- 5、写一个脚本
```
(1)显示当前系统上所有默认shell为bash的用户的用户名、UID以及此类所有用户的UID之和;
```
```
#!/bin/bash
egrep "/bin/bash" /etc/passwd | cut -d: -f1
egrep "/bin/bash" /etc/passwd | cut -d: -f3
declare -i sum=0
for i in `egrep "/bin/bash" /etc/passwd | cut -d: -f3`;do
sum=$[ $i+$sum ]
done
echo -e "\E[1;33mUID之和为:$sum\033[0m"
```
- 6、写一个脚本
```
(1)使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;
(2)在线的主机使用绿色显示;
(3)不在线的主使用红色显示;
(4)请使用函数完成
```
```
#!/bin/bash
# 使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;
# 在线的主机使用绿色显示;
# 不在线的主使用红色显示;
PING(){
if ping -c1 -w1 172.16.250.$1 &> /dev/null;then
# 可以ping通
echo -e "\E[1;32m172.16.250.$1 在线\033[0m"
else
# 不能ping通
echo -e "\E[1;31m172.16.250.$1 不在线\033[0m"
fi