收集的一些shell练习题
# 练习题
# 基本语法
- 循环ping192.168.110网段的所有主机
#!/bin/bash
i=1
for i in {1..254}
do
# 参数说明-c指定ping次数,-w 指定ping超时时间, -i为ping间隔
ping -c 2 -w 3 -i 0.3 192.168.110.$i $> /dev/null
if [ $? -eq 0 ] ;then
echo "192.168.110.$i is yes"
else
echo "192.168.110.$i is no"
fi
let i++
done
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- for批量创建用户
user=$`cat /opt/user.txt`
for i in $user
do
useradd $i
echo "1234" | passwd --stdin $i
done
~
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 编写脚本文件example1.sh,存放在/home/cauc/scripts目录下。 脚本功能为:查找某文件是否存在(以参数形式),若存在,则将其权限设置为用户主可读可改,其他人无任何权限。否则则返回无此文件的信息。
#!/bin/bash
if [ -e $1 ]
then
chmod 600 $1
else
echo "The file $1 does not exist"
fi
1
2
3
4
5
6
7
2
3
4
5
6
7
- 编写脚本文件sum.sh,存放在/home/cauc/scripts目录下。脚本功能为:计算从1加到100的和并返回结果
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$(($s+$i));
done
echo "the sum is:$s"
1
2
3
4
5
6
7
2
3
4
5
6
7
- 编写 shell脚本, 首先显示当天日期, 然后查找给定的用户是否在系统中工作(who 命令)。 如果在系统中,就输出一条欢迎语句(例如 hello, xxx!);如果不在系统中,就输出一条语句(waiting for xxx!)
#!/bin/bash
date
if who|grep "^$1"
then
echo "hello,$1!"
else
echo "waiting for $1!"
fi
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 为指定用户发送在线消息
(1)若指定用户不在线(未登陆系统),则每10分钟(实验中为了测试效果,可改为3s)试一次,直至用户登录系统后再发送信息
(2)用户名与消息通过为止参数传递给脚本
#!/bin/bash
username=$1
#判断格式参数是否为空
if [ $# -lt 1 ]
then
echo "Usage:`basename $0` <username> [<message>]"
exit 1
fi
#判断账号是否存在
if grep "^$username:" /etc/passwd &> /dev/nell;then :
else
echo "用户不存在"
exit 2
fi
#判断用户是否在线
until who | grep "$username" &> /dev/null
do
echo "用户不在线,正在尝试连接"
sleep 3
done
mes=$*
echo "$mes" | write "$username"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 编写一个shell脚本以输出一个文本文件nowcoder.txt中的行数
echo $(wc -l < ./a.sh )
1
- 查看日志的时候,经常会从文件的末尾往前查看,请你写一个bash shell脚本以输出一个文本文件nowcoder.txt中的最后5行。
tail -n 5 < nowcoder.txt
1
2
2
- 编写一个bash脚本以输出一个文本文件nowcoder.txt中第5行的内容。
# 方法1
awk "NR==5" nowcoder.txt
# 方法2
head -n 5 ./nowcoder.txt | tail -n 1
# 方法3
cat nowcoder.txt | sed -n '5,5p'
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 三剑客(sed/awk/grep)
- 编写一个shell脚本以输出一个文本文件nowcoder.txt中空行的行号(空行可能连续,从1开始输出)
# 方法1
# 参数说明:-n打印行号,'^\s*$' 表示开头到结尾0个或多个空白字符
grep -n '^\s*$' ./nowcoder.txt
grep -n '^$' ./nowcoder.txt
# 方法2
awk '/^\s*$/{print NR}' nowcoder.txt
# 方法3
cat nowcoder.txt | sed -n '5,5p'
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 写一个 bash脚本以去掉一个文本文件nowcoder.txt中的空行
# 方法1
grep -v '^$' nowcoder.txt
# 方法2
$ cat ./nowcoder.txt | sed -n '/^$/!p'
# 方法3
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 写一个bash脚本以统计一个文本文件nowcoder.txt中字母数小于8的单词。
# 方法1
for i in $(cat nowcoder.txt)
do
# echo "$i"
count=$(( $(echo $i | wc -c) - 1 ))
if [ $count -lt 8 ]
then
echo $i
fi
done
# 方法2
awk -F" " '{for(i=1;i<=NF;i++){if(length($i) < 8){print $i}}}' nowcoder.txt
# 方法3
cat nowcoder.txt | sed 's/ /\n/g' | awk '{if(length($0)<8) print}'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 统计所有进程占用内存百分比的和
# 方法1
sum=0
for i in $(ps -aux | awk '{print $6}' nowcoder.txt)
do
((sum+=$i))
done
echo $sum
# 方法2
cat nowcoder.txt | gawk '{sum+=$4}END{print sum}'
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 写一个 bash脚本以统计一个文本文件 nowcoder.txt 中每个单词出现的个数。
示例:
假设 nowcoder.txt 内容如下:
welcome nowcoder
welcome to nowcoder
nowcoder
1
2
3
2
3
你的脚本应当输出(以词频升序排列):
to 1
welcome 2
nowcoder 3
1
2
3
2
3
# 方法1
awk '{for(i=1;i<=NF;i++) a[$i]+=1}END{for(x in a) print x,a[x]}' nowcoder.txt
1
2
2