- 函数内如何设置局部变量(A)
A:local
B:export
C:source
D:function
- 以下哪一种指令显示的结果为$test©
A:\echo $test
B:echo “$test”
C:echo ‘$test’
D:echo “${test}”
- 一个bash shell脚本的第1行是什么(A)
A:#!/bin/bash
B:#/bin/bash
C:#/bin/csh
D:/bin/bash
- 以下参数,如何在执中查看执行过程(A)
A:-x
B:-X
C:-s
D:-S
第2章 简答
- 如何显示默认的环境变量
env
set
- 如何设置环境变量与局部变量
环境变量加export
局部变量不加export
第3章 编程
- 按照时间生成文件
2018-05-22.log
将每天的磁盘使用状态写入到对应日期的文件
[root@shell word]# cat date.sh
#!/bin/bash
Date=`date +%F`
df -h|awk "NR==1||NR==6||NR==7" > ${Date}.log
- 统计Nginx日志中每个IP的访问量有多少,日志如下:
`192.168.56.1 - - [21/May/2018:20:44:06 -0400] "GET /index.html HTTP/1.0" 404 169 "-" "ApacheBench/2.3" "-"/code/index.html`
[root@shell word]# cat nginx.sh
#!/bin/sh
awk '{print $1}' /var/log/nginx/access.log|sort|uniq -c|sort -rn
- 写一个脚本计算一下Linux系统所有进程占用内存大小的和
[root@shell word]# cat mem.sh
#!/bin/sh
total=`ps aux|awk '{print $4}'|grep -v %MEM|awk '{sum=sum+$1}END{print sum}'`
echo "所有进程占用内存大小: " $total
- 在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件
1.批量修改txt为txt.bak
echo *.txt|xargs -n1|awk -F. '{print"mv " $1".txt " $1".txt.bak"}'|bash
echo *.txt|xargs -n1|sed -r 's/(.*).txt$/mv \1.txt \1.txt.bak/g'|bash
[root@shell word]# cat mv.sh
#!/bin/sh
for i in `seq 10`
do
mv /backup/${i}.txt /backup/${i}.txt.bak
done
2.把所有的.bak文件打包压缩为123.tar.gz
tar -zcvf 123.tar.gz ./*.bak
3.批量还原文件的名字,及把增加的.bak再删除
echo *.bak|xargs -n1|awk -F. '{print"mv " $1".txt.bak " $1".txt"}'|bash
- 写出以下位置参数的作用
$0 : 脚本名称
$n : 脚本的第N个参数
$# : 获取脚本的总参数
$* : 获取脚本的所有参数
$@ : 获取脚本的所有参数
- 写出以下特殊变量的作用
$? : 上条命令执行的结果
$$ : 获取脚本的PID
$! : 获取上个脚本执行的PID
$_ : 获取脚本的最后一个参数
- 写出以下字母比较的作用
-eq : 等于
-ne : 不能等于
-gt : 大于
-ge : 大于等于
-lt : 小于
-le : 小于等于
- 写出下面特殊变量扩展的意义
${oldboy} : 变量
${#oldboy} : 变量长度的统计
${url#*.} : 从前往后删
${url##*.} : 从前往后删,贪婪匹配
${url%.*} : 从后往前删
${url%%.*} : 从后往前删,贪婪匹配
第2章 简答
- 写出3个以上可用于计算的命令
1. expr 1 + 1
2. echo $[1+1]
3. echo 10 20|awk '{print $1*$2}'
4. awk 'BEGIN{print 1+1}'
第3章 编程
- 输入两个整数计算这两个整数的相加,相减,相乘,相除,求余的结果
while true
do
read -p "请输入两个整数: " num1 num2
echo "${num1}+${num2} = `awk "BEGIN{print ${num1}+${num2}}"` "
echo "${num1}-${num2} = `awk "BEGIN{print ${num1}-${num2}}"` "
echo "${num1}*${num2} = `awk "BEGIN{print ${num1}*${num2}}"` "
echo "${num1}/${num2} = `awk "BEGIN{print ${num1}/${num2}}"` "
echo "${num1}%${num2} = `awk "BEGIN{print ${num1}%${num2}}"` "
done
- 把一个文本文档的前五行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉
awk 'NR<=5' /server/scripts/word/1.txt|sed -i "/[a-z]/d"
sed -in '6,10s/[a-z]//gp' 1.txt
- 打印下面这句话中字母数小于5的单词 I am lizhenya teacher I am 18
[root@shell word]# cat name.sh
for i in I am lizhenya teacher I am 18
do
if [ ${#i} -gt 5 ];then
echo "${i}"
fi
done
[root@shell word]# sh name.sh
lizhenya
teacher
- 写个shell,看看你的linux系统中是否有自定义用户(普通用户),若是有,一共有几个?
[root@shell word]# cat user.sh
#!/bin/sh
user=`awk -F[:/] '{print $7}' /etc/passwd`
a=0
for i in $user
do
[ "$i" = "home" ] && let a++
done
echo "普通用户为: $a"
[root@shell word]# sh user.sh
普通用户为: 6
- 写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10
history|awk '{print $2}'|sort|uniq -c|sort -rn|head
- 编写一个脚本,计算100以内所有能被3整除数字的和
[root@shell word]# cat ran1.sh
#!/bin/sh
sum=0
for i in `seq 100`
do
if [ $((${i}%3)) -eq 0 ];then
let sum+=$i
fi
done
echo $sum
[root@shell word]# sh ran1.sh
1683
判断
- 填写以下字符串测试操作符的意义
-n :字符串长度不为0,则为真
-z : 字符串长度为0,则为真
- 写出下面条件测试的含义
[ -e dir|file ] : 文件存在则为真
[ -d dir ] : 目录存在则为真
[ -f file ] : 普通文件存在则为真
[ -r file ] : 文件存在可读 则为真
[ -x file ] : 文件存在可执行 则为真
[ -w file ] : 文件存在可写 则为证
- 定义变量内容,不加引号、单引号、双引号、反引号结果有什么不同?应该怎么用?
不叫引号 : 可以解析变量
单引号 : 不可以解析变量
双引号 : 可以解析变量
反引号 : 执行命令
- 将下面的条件表达式改写为if条件语句
[ -f /etc/hosts ] && echo !
[root@shell word]# cat 22.sh
#!/bin/sh
ls /etc/hosts &>/dev/null
if [ $? -eq 0 ];then
echo "存在"
else
echo "不存在"
fi
- 写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些
[root@shell word]# cat network.sh
#!/bin/sh
for i in {1..254}
do
ping -c1 -W1 10.0.0.$i &>/dev/null
if [ $? -eq 0 ];then
echo "10.0.0.${i} : 在线"
fi
done
- 用shell处理以下内容
the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation
1. 按单词出现频率降序排序!
egrep '[a-Z]+' word.txt -o|sort|uniq -c|sort -rn
2. 按字母出现频率降序排序!
grep '[a-Z]' word.txt -o|sort|uniq -c|sort -rn|head
[root@shell word]# cat word.sh
#!/bin/sh
egrep '[a-Z]+' word.txt -o|sort|uniq -c|sort -rn
grep '[a-Z]' word.txt -o|sort|uniq -c|sort -rn
- 使用ps aux查看系统进程发现有100多个test.sh脚本正在运行,如何杀死所有的test.sh
ps aux|grep test.sh|awk '{print $2}'|xargs kill -9
- 写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比语塞数字大或者小
[root@shell word]# cat number.sh
#!/bin/sh
num=`echo $((RANDOM%100))`
echo $num
while true
do
for i in $num
do
read -p "请输入你想要的数字: " num1
if [ $num1 -eq $num ];then
echo "恭喜你猜对了"
exit
elif [ $num1 -gt $num ];then
echo "您输入的数字大了"
elif [ $num1 -lt $num ];then
echo "您输入的数字小了"
break
fi
done
done
- 用Shell实现,把一个文本文档中只有一个数字的行给打印出来
[root@shell word]# cat ran3.sh
#!/bin/sh
while read line
do
num=`echo $line|sed 's/[^0-9]//g'|wc -L`
if [ $num -eq 1 ];then
echo $line
fi
done<2.txt
- 写一个Shell脚本通过curl命令返回的状态码来判定所访问的网站是否正常,比如当前状态码200,才算正常
[root@shell word]# cat curl.sh
#!/bin/sh
read -p "请输入域名: " num
for i in $num
do
num1=`curl -Is ${num}|awk 'NR==1{print $2}'`
if [ $num1 -eq 200 ];then
echo "${i} 正常"
else
echo "${i} 不正常"
fi
done
- 写出break continue exit return 的区别
break :
退出循环,执行下一个循环.如果没有直接退出
continue :
退出当前循环,返回上一次继续循环
exit :
退出循环
return :
当前函数返回,那就是退回到上一层调用处继续运行下面的代码,当然如果是在主函数main, 自然也就结束当前进程了。
return也可以用于void无返回值的函数中,就是结束这个函数运行,从调用处开始执行下一段代码。
return 表达式或值 ;一般用于带参数的函数,将表达式或值返回到调用处并退出这个函数的执行。从汇编语言的角度来说就是传送一个值到预定的寄存器或内存空间,并将CPU运行的相关寄存器内容出栈,返回调用处开始执行下一条指令
- 查看数组的索引与数组中元素的个数
- 生成0-100之间的随机数,并相加,直到大于1000,输出相加的结果
[root@shell word]# cat together.sh
#!/bin/sh
num=0
while [ $num -le 1000 ]
do
num1=$((RANDOM%101))
num=$((num+$num1))
done
echo $num
- 生成0-100之间的随机数,并相加,直到大于1000,并判断最后一个随机数字能否被3整除
[root@shell word]# cat together1.sh
#!/bin/sh
sum=0
num=0
while [ $sum -le 1000 ]
do
num=$((RANDOM%101))
sum=$((sum+num))
done
if [[ $((${num}%3)) == 0 ]];then
echo "最后一个随机数为: ${num} ,可以被3整除"
else
echo "最后一个随机数为: ${num} ,不可以被3整除"
fi
- 判断/tmp目录下是否有大于4k的文件,如果有则输出该文件的大小与创建时间
[root@shell word]# cat find.sh
#!/bin/sh
for i in `find /tmp/ -type f -size +4k`
do
if [ -e /tmp/ ];then
echo ${i}|xargs ls -lh|awk '{print "文件为: "$NF" 大小为: "$5" 创建时间为: "$6" "$7" "$8}'
fi
done
[root@shell word]# sh find.sh
文件为: /tmp/acces.log 大小为: 8.4K 创建时间为: May 15 23:24
文件为: /tmp/acces.log.txt 大小为: 8.4K 创建时间为: May 15 23:32
- 数组array=(1 2 3 4 5 6)使用脚本打印出每个元素(每行显示一个元素)
[root@shell word]# cat array.sh
#!/bin/sh
array=(1 2 3 4 5 6)
for i in ${!array[*]}
do
echo ${array[$i]}
done
- 使用数组判断I am oldboy teacher welcome to training class中字母数大于6的单词
[root@shell word]# cat array2.sh
#!/bin/sh
array=(I am oldboy teacher welcome to training class)
for i in ${!array[*]}
do
if [ ${#array[$i]} -gt 5 ];then
echo ${array[$i]}
fi
done
- 检测服务器中重要的文件是否被修改吗如果被修改则报警
[root@shell word]# cat police.sh
#!/bin/sh
md5_police=/root/police/police.md5
md5_file=`md5sum -c $md5_police|awk '{print $2}'`
md5failed=`md5sum -c $md5_police`
if [ $md5_file = "OK" ];then
echo "正常"
else
echo "${md5failed} 文件被修改" > /root/police/md5.failed
mailx -s "文件被修改" 973000142@qq.com < /root/police/md5.failed
fi
[root@shell word]# sh police.sh
正常
方法二:
[root@shell word]# cat police2.sh
#!/bin/bash
md5_file="/services/scripts/practice/md5.txt"
result=`md5sum -c ${md5_file}`
echo "${result}"|awk -F"[: ]+" '$2 ~ /失败/{print}' > md5.failed
line=`cat md5.failed|wc -l`
if [[ ${line} -gt 0 ]]
then
echo "文件被修改!!!被修改文件有:"
while read line
do
echo ${line}| awk -F"[: ]+" '{print $1}'
done < md5.failed
mailx -s "文件已被修改" 3413034530@qq.com < md5.failed
fi
- 计算nginx日志中访问最多的10个IP使用的流量总和
- 防止DOS攻击(检测nignx日志若某个IP短时间的PV过大则使用防火墙将其禁掉)
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
interval=180
log_path="/var/log/nginx"
log_name_access="access.log"
log_name_error="error.log"
pid_path="/var/run/nginx.pid"
log_name_temp="nginx_temp.log"
recovery_name="nginx_recovery.log"
now=`date +%F`
function log_cut()
{
[ -d ${log_path} ] && [ -f ${log_path}/${log_name_access} ] && \
/usr/bin/mv -f ${log_path}/${log_name_access} ${log_path}/${log_name_temp} || return 1
[ -f ${pid_path} ] && kill -USR1 `cat ${pid_path}` || return 1
}
function log_recovery()
{
[ -d ${log_path} ] && [ -f ${log_path}/${log_name_temp} ] && cat ${log_path}/${log_name_temp} >> ${log_path}/${recovery_name} || return 1
rm -rf ${log_path}/${log_name_temp}
}
function block_ip()
{
[ -d ${log_path} ] && awk '{print $1}' ${log_path}/${log_name_temp}|sort|uniq -c|sort -rnk1 > ${log_path}/ip.log || return 1
if [ -f ${log_path}/ip.log ]
then
while read line
do
local pv=`echo ${line}|awk '{print $1}'`
local ip_add=`echo ${line}|awk '{print $2}'`
if [ ${pv} -ge 300 -a `iptables -nL|grep "${ip_add}"|wc -l` -lt 1 ]
then
iptables -I INPUT -s ${ip_add} -j DROP
echo ${ip_add} >> ${log_path}/`date +%F`_ip.log
fi
done < ${log_path}/ip.log
fi
}
function del_block_ip()
{
if [ -f ${log_path}/`date +%F -d "yesterday"`_ip.log ]
then
while read line
do
iptables -D INPUT -s ${line} -j DROP
done < ${log_path}/`date +%F -d "yesterday"`_ip.log
fi
}
while true
do
log_cut
if [ $? -ne 0 ]
then
echo "文件不存在"
continue
fi
if [[ `date +%F` != ${now} ]]
then
del_block_ip
now=`date +%F`
fi
block_ip
if [ $? -ne 0 ]
then
echo "文件不存在"
continue
fi
log_recovery
sleep ${interval}
done