- 编写shell脚本,计算1-100的和
!#/bin/bash
##计算求和
##Writen by zcy 2018-4-28
sum=0
for i in `seq 1 100`; do
sum=$[$i+$sum]
done
echo $sum
2 . 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止;
#!/bin/bash
##交互
##writen by zcy 2018-4-28
#! /bin/bash
n=0
while [ $n -lt "1" ]; do
read -p "Please input a number, it must greater than "1":" n
done
sum=0
for i in `seq 1 $n`; do
sum=$[$i+$sum]
done
echo $sum
3 . 编写shell脚本,把/root/目录下的所有目录(只需要一级)拷贝到/tmp/目录下
#! /bin/bash
cd /root
for f in `ls `; do
if [ -d $f ] ; then
cp -r $f /tmp/
fi
done
~
4 . 编写shell脚本,批量建立用户user_00, user_01, … user_100并且所有用户同属于users组
#! /bin/bash
groupadd users
for i in `seq 0 9`; do
useradd -g users user_0$i
done
for j in `seq 10 100`; do
useradd -g users user_$j
done
5 . 编写shell脚本,截取文件test.log中包含关键词 ‘abc’ 的行中的第一列(假设分隔符为 ”:” ),然后把截取的数字排序(假设第一列为数字),然后打印出重复次数超过10次的列
#! /bin/bash
awk -F':' '$0~/abc/ {print $1}' test.log >/tmp/n.txt
sort -n n.txt |uniq -c |sort -n >/tmp/n2.txt
awk '$1>10 {print $2}' /tmp/n2.txt
6 编写shell脚本,判断输入的IP是否正确(IP的规则是,n1.n2.n3.n4,其中1
#! /bin/bash
checkip() {
if echo $1 |egrep -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ; then
a=`echo $1 | awk -F. '{print $1}'`
b=`echo $1 | awk -F. '{print $2}'`
c=`echo $1 | awk -F. '{print $3}'`
d=`echo $1 | awk -F. '{print $4}'`
for n in $a $b $c $d; do
if [ $n -ge 255 ] || [ $n -le 0 ]; then
echo "the number of the IP should less than 255 and greate than 0"
return 2
fi
done
else
echo "The IP you input is something wrong, the format is like 192.168.100.1"
return 1
fi
}
rs=1
while [ $rs -gt 0 ]; do
read -p "Please input the ip:" ip
checkip $ip
rs=`echo $?`
done
echo "The IP is right!"
作业题
shell脚本中,怎么做可以把某一行给注释掉?
在行首使用#来注释掉
如何执行一个shell脚本呢?
sh xx.sh
或者给予X权限后 ./xx.sh
为了方便管理,我们约定把shell脚本都放到哪个目录下?
/usr/local/bin
为了更好的调试shell脚本,我们可以加一个选项来观察shell脚本的执行过程,是哪个选项呢?
-x选项
使用date命令打印5天前的日期,要求日期格式为: xxxx-xx-xx
date --date "5 days ago" +"%Y-%m-%d"
或
date --date "5 days ago" +"%F"
脚本中,变量赋值=左右2边不能有空格
shell脚本中如何使用数学运算
#!/bin/bash
a=1
b=3
c=$[$a+$b]
echo $c
- shell脚本中有一个命令可以实现脚本和用户交互,请问是哪个命令,怎么使用?
read -p
- 在shell中如何进行大小或者等于判断?
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
-eq 等于
-ne 不等于
- shell脚本中,用什么符合表示并且,用什么符合表示或者?
并且 && 或者 ||
- shell脚本中,case逻辑判断的结构是什么样的?
case 变量名 in
value1)
command
;;
value2)
command
;;
*)
command
;;
esac
- 列举出shell脚本中常用的循环结构。
for 变量名 in 条件; do …. done
while 条件; do … done
- shell脚本中函数的作用是什么?函数结构是什么样的?
作用:就是把一段代码整理到了一个小单元中,并给这个小单元自定义名字,方便调用
function filename(){
command
}
- 写脚本实现,把一个目录下的所有文件(不含有目录)全部在文件
名后面加一个.bak
#!/bin/bash
for i in `ls -al|grep -v 'd'|awk -F ' ' '{print $9}'`;do
mv $i $i".bak"
done
- 编写一个shell脚本,讲当前目录下大小大于100K的文件全部移动到/tmp/ 目录下。
#!/bin/bash
value=`ls -l|awk -F ' ' '{print $5,$NF}' | awk '{if($1>100) {print $NF}}'`
for file in $value
do
mv $file /tmp/
done
- 写一个小脚本,获取本机的HOSTNAME、IP地址以及DNS地址。
hostname=`hostname`
echo "hostname : " $hostname
ip=`/sbin/ifconfig -a | grep 'inet addr' | awk -F ':' '{print $2}' | awk '{print $1}'`
for i in $ip
do
echo "`ifconfig | grep -B1 "$i" | grep -v 'inet addr' | awk '{print $1}'` "$i""
done
DNS=`cat /etc/resolv.conf |grep nameserver|grep -v '#'`
echo $DNS
- 写两个小脚本验证break和continue在循环中的作用
for i in `seq 1 10`;do
if [ $i -ne 5 ];then
echo $i
else
break
fi
done
for i in `seq 1 10`;do
if [ $i -ne 5 ];then
echo $i
else
continue
fi
done
差别为,一个直接终止循环,一个终止不符合条件的输出,循环将继续。