批量修改/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脚本练习题