欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

shell脚本练习题

程序员文章站 2024-03-15 23:26:54
...

批量修改/data/test/dir文件夹下的文件名后缀为.log

#!/bin/bash
#
DIR=/data/test/dir
cd $DIR
for file in ;do
file_name=`echo $file | sed -nr 's#(.
)..*#\1#p'`
mv $file ${file_name}.log
echo $file is renamed ${file_name}.log
done

计算1+……100的计算结果
#!/bin/bash
#
sum=0;
for i in {1..100};do
let sum+=i;
done
echo sum is $sum

计算100以内能被3整除的数字的和
sum=0
for i in {1..100} ; do
if [ $[i%3] -eq 0 ];then
let sum+=i
fi
done
echo sum is $sum
另一种方法
#!/bin/bash
sum=0
for i in {3..100..3} ;do
let sum+=i;
done
echo "sum is $sum"

不用脚本实现方法如下:
sum=0; for i in {3..100..3};do let sum+=i; done; echo $i $sum

用for实现判断/var目录下所有文件的类型
#!/bin/bash
#
for i in $(find /var); do
if [ -b $i ];then
echo "$i is block device"
elif [ -c $i ]; then
echo "$i is character device"
elif [ -f $i ]; then
echo "$i is normal file"
elif [ -h $i ]; then
echo "$i is symbol link file"
elif [ -p $i ]; then
echo "$i is pipe file"
elif [ -S $i ]; then
echo "$i is socket file"
elif [ -d $i ]; then
echo "$i is directory file"
else
echo "file or directory not exist"
fi
done
exit 0

添加10个用户user1-user10,密码为8为随机密码
#解释$( )等同于
tr -cd [[:alnum:]]!#@] < /dev/urandom |head -c 8
/dev/urandom表示随机数生成命令
tr -cd [[:alnum:]]!
#@] < /dev/urandom表示从随机数中取出包含[[:alnum:]]!#@]这些字符的内容
tr -cd [[:alnum:]]!
#@] < /dev/urandom |head -c 8表示从上面取出的内容中取头8个字符
#!/bin/bash
for n in $(seq 1 10);do
name=user$n
useradd "$name"
echo "$(tr -cd [[:alnum:]]!_#@] < /dev/urandom |head -c 8)" |passwd --stdin $name &> /dev/null
echo "User create"
done
exit 0

在/etc/rc.d/rc3.d目录下分别读取每个文件,以K开头的输出为文件名加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start(注: 和$( )效果相同)

#!/bin/bash
for i in ls /etc/rc.d/rc3.d ;do
[[ $i =~ ^K.* ]] && echo "$i stop"

    [[ $i =~ ^S.* ]] && echo "$i start"

done
另一种写法,以忽略大小写的方式,及k|K,s|S均可
#!/bin/bash
for i in $(ls /etc/rc.d/rc3.d | egrep -i "^k.*"); do
echo "$i stop"
done

for i in $(ls /etc/rc.d/rc3.d |grep -i "^s.*"); do
echo "$i start"
Done

计算1+..N的和,提示输入最后的N值
#!/bin/bash
read -p "please input the last number : " N
sum=0
for i in $(seq 1 $N) ;do
let sum+=i;
done
echo sum is $sum

编写脚本,提示请输入网络地址,如:192.168.0.0,判断输入的网段中主机在线状态(执行后用ps aux 找到该脚本的进程号,kill 进程号,方可退出)
#!bin/bash
read -p "please input the IP,such as 192.168.0.0:" IP
net=$(echo $IP | cut -d"." -f1-2)
for i in {1..255} ; do
for j in {1..255} ; do
netip=$net.$i.$j
ping -w1 -c1 $netip &> /dev/dull && echo "$netip is up!" || echo "$netip is down!"
done
done

打印九九乘法表(\t表示横向跳到下一个制表符位置,echo表示换行,-e表示启用反斜杠转义的解释,-n表示不输出尾随新行)
#!/bin/bash
for i in {1..9} ; do
for j in $(seq $i) ; do
echo -en "${i}${j}=$[$i$j]\t"
done
echo
done

在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如1abcd1234.html
#解释tr -cd [:alpha:] < /dev/random |head -c 8
/dev/random为随机数产生的命令
tr -cd [:alpha:] < /dev/random为从随机数中取出字母
tr -cd [:alpha:] < /dev/random |head -c 8,表示从取出的字母中选取头8个字符,脚本如下
#!/bin/bash
for N in {1..10} ; do
file=$(echo "$N$(tr -cd [:alpha:] < /dev/random |head -c 8).html")
touch /data/test/dir/$file
echo "$file is created."
done

打印等腰三角形
#!/bin/bash
read -p "please input isoletes triangle: " line
for i in $(seq 1 $line) ; do
spacenum=$[$line-$i]
anum=$[2$i-1]
for j in $(seq 1 $spacenum);do
echo -e "" "\c"
done
for k in $(seq 1 $anum) ; do
echo -e "
\c"
done
echo
done

猴子吃桃,第一天摘下若干桃子,吃了一半,接着又吃一个,第二天接着吃了一半,接着又吃了一个,这样一直到第十天,只有一个桃子,第一天一共摘了多少?
#解释:猴子一共吃了9天桃子,反推第九天桃子数量(第十天桃子为1+1)2,第八天桃子数量(第九天桃子+1)2,第一天桃子数量(第二天桃子+1)2,按照这个规律进行了9次。
#!/bin/bash
sum=1
for i in {1..9} ; do
let sum=(sum+1)
2
done
echo "the total peaches are : $sum"

用while实现100以内所有正奇数之和
#解释while中用算数表达式不能用
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ] ;do
let sum=sum+i;
let i=i+2;
done
echo sum is $sum

利用while编写脚本,提示输入网络地址如:192.168.0.1,判断输入的网段中主机在线状态,并统计在线和离线主机各多少?
#解释:先截取前16位地址,后16位地址构建2个嵌套循环
#!/bin/bash
read -p "please input new(eg:192.168.0.0): " net
netid=$(echo $net | cut -d. -f1-2)
i=0
up=0
down=0
while [ $i -le 254 ] ;do
j=1
while [ $j -le 254 ] ; do
if ping -c1 -w1 $netid.$i.$j &> /dev/dull ;then
echo "the $netid.$i.$j is up"
let up++
else
echo "the $netid.$i.$j is down"
let down++
fi
let j++
done
let i++
done
echo "the up is $up"
echo "the down is $down"

用while实现打印九九乘法表
#!/bin/bash
i=1
while [ $i -le 9 ] ; do
j=1
while [ $j -le $i ] ; do
let k=ij
echo -en "$i
$j=$k\t"
let j++
done
echo
let i++
done

用文件名作为参数,统计所有参数文件的总行数

编写函数实现两个数字作为参数,返回最大值
#!/bin/bash
max() {
if [ $# -ne 2 ] ;then
echo "please enter two digits"
exit 1
else
if [[ $1 =~ ^[0-9]+$ ]] && [[ $2 =~ ^[0-9]+$ ]] ; then
if [ $1 -gt $2 ];then
echo the max is $1
else
echo the max is $2
fi
else
echo "please enter legal number"
exit 2
fi
fi
}
max $1 $2

用文件名作为参数,统计所有文件的总行数
#解释$#表示传递给脚本的参数个数,算数运算格式var=$[运算表达式],等同于let var=算数表达式
#!/bin/bash
sum=0
while [ $# -gt 0 ] ; do
lines=$(cat $1 | wc -l)
shift
sum=$[$sum+$lines]
done

echo $sum

每隔3秒钟到系统上获取已经登录的⽤户的信息;如果发现⽤户
hacker登录, 则将登录时间和主机记录于⽇志/var/log/login.log中,并
退出脚本

#!/bin/bash
until false ; do
if who | grep "^hacker\>" &> /dev/null ;then
who | grep "^hacker\>" > /var/log/login.log
break
fi
sleep 3
done

编写函数,实现取出当前系统eth0的IP地址
#!/bin/bash
eth0ip (){
ip=ifconfig ens33 |grep netmask|tr -s ' '|cut -d' ' -f3
echo ip=$ip
}
eth0ip

编写函数,实现打印绿色和红色FAIED
#注释颜色起始\033[1;31m,颜色中止\033[0m,使用方法:\033[1;31m文本\033[0m,echo -e表示启用反斜杠转义的解释
#!/bin/bash
redgreen(){
echo -e "\033[1;32mOK\033[0m"
echo -e "\033[1;31mFAILED\033[0m"
}
redgreen

编写函数,实现判断是否无位置参数,如无参数,提示错误
#!/bin/bash
args(){
if [ $# -eq 0 ] ; then
echo "please input a parameter!"
fi
}
args $1

shell脚本练习题

转载于:https://blog.51cto.com/14231434/2375661