shell 脚本100 例

1: 编写一个hello work 脚本

1
2
#! /bin/bash
echo "hello word"

2: 通过位置变量创建linux系统账户及密码

1
2
3
#!/bin/bash
useradd $1 -c "测试用户" -G root -s /usr/sbin/nologin
echo $2 | passwd $1 --stdin

3: 每周5使用tar命令备份/var/log下的所有日志文件

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 备份的文件尽量用目前的日期命名
# P 因为tar 默认允许是相对路径, 如果路径写的是绝对路径 要加大写 P,要放在f前面
tar zcPf /tmp/log-`date +%F-%H-%M`.tar.gz /var/log/*.log

---

# crontab -e
00 03 * * 5 /bin/bash /tmp/备份.sh

4: 一键部署LNMP (rpm包版本)

1
2
3
4
5
6
7
8
9
#!/bin/bash
#配置yum源,安装epel源
yum install epel-release
yum makecache
yum install nginx
yum install mysql
yum install php php-mysql
systemctl start nginx mysql
systemctl enable nginx mysql

5: 实时监控本机内存和硬盘剩余空间,剩余内存小于500M ,根空间剩余小于1000M 时发送报警邮件给root管理员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#if语句中 -a "and 且" | -o "or 或者"
# awk // 正则
memu=400
diskmu=4000
mem=$(free -m | awk '/Mem/{print $4}')
disk=$(df -m / | awk '/\//{print $4}')
if [ $mem -lt $memu -a $disk -lt $diskmu ];then
echo "资源不够用" | mail root -s
elif [ $mem -lt $memu ];then
echo "内存小于$memu" | mail root -s
elif [ $disk -lt $diskmu ];then
echo "磁盘小于$diskmu" | mail root -s
fi

6: 脚本生成一个100以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了或者猜小了 猜大了 直至用户结束脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#!/bin/bash
# $RANDOM 随即范围 0-32767 , 使用取余算法将随机数变为1-100的随机数 $[$RNADOM%100+1]
# echo 换行打印 参数 -e
# grep 匹配静默输出参数 -q
# 判断输入的类型是否是数字 使用grep 正则去判断 如果匹配到数字则返回0 匹配不到数字则返回1
yes=$[$RANDOM%10]
echo -e "这是一个猜数字游戏 \n输入你要猜的数字进行"

while true;do
read -p "请输入你要猜的数字:" num
if grep -q '^[[:digit:]]*$' <<< "$num" ;then
if [ $num -lt $yes ];then
echo "数字小于正确答案"
elif [ $num -gt $yes ];then
echo "数字大于正确答案"
elif [ $num -eq $yes ];then
echo "恭喜你才对了"
exit
else
echo "请输入真确的数字"
fi
else
echo "请输入数字"
fi
done

7: 检测本机当前用户是否为超级管理员,如果是管理员, 则使用yum安装vsftp ,如果不是,则提示您非管理员(使用字符串对比版本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

if [[ $USER == "root" ]];then
yum install vsftp -y
else
echo "请用管理员账号操作"
fi

---

#!/bin/bash

if [[ $UID == 0 ]];then
yum install vsftp -y
else
echo "请用管理员账号操作"
fi

8: 编写脚本: 提示用户输入用户名和密码,脚本自动创建相应的账户和配置密码,如果用户不输入账户名,则提示必须输入账户名并退出脚本,如果用户不输入密码,则统一使用默认的123456 作为默认密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
#if -n 不为空。-z 为空
read -p "输入要创建的用户名:" user

#[ ! $user] && useradd $user || echo "请输入用户名" exit 2

if [ -n "$user" ];then
useradd $user
read -p "输入密码:" password
password=${password:-123456}
echo $password | passwd $user --stdin
else
echo "必须输入用户名"
exit 2
fi

9: 依次提示用户输入3个整数,脚本根据数字大小依次排序输出3个数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

#eval命令: 执行时会先扫描命令一遍 进行命令替换,然后在执行命令,用于那些使用一次扫描无法实现其功能的变量。

read -p "输入多一个数字:" num1
read -p "输入第二个数字:" num2
read -p "输入第三个数字:" num3

if [ $num1 -gt $num2 ];then
tmp=$num1
num1=$num2
num2=$tmp
fi

if [ $num1 -gt $num3 ];then
tmp=$num1
num1=$num3
num3=$tmp
fi

fi [ $num2 -gt $num3 ];then
tmp=$num2
num2=$num3
num3=tmp
fi
echo "数字大小依次为:$num1 - $num2 - $num3"

10: 编写脚本,实现人机 剪刀石头布游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/bash
#case形式
num=$[$RANDOM%3+1]

echo -e "1.石头 \n2.剪刀 \n3.布"

read -p "输入1-3:" user
case $user in
1)
if [ $num -eq 1 ];then
echo "平局"
elif [ $num -eq 2 ];then
echo "你赢了"
else
echo "你输了"
fi;;
2)
if [ $num -eq 2 ];then
echo "平局"
elif [ $num -eq 3 ];then
echo "你赢了"
else
echo "你输了"
fi;;
3)

if [ $num -eq 3 ];then
echo "平局"
elif [ $num -eq 1 ];then
echo "你赢了"
else
echo "你输了"
fi;;
*)
echo "必须输入1-3数字"
esac


#if形式
#echo -e "1.石头 \n2.剪刀 \n3.布"
#while true;do
# read -p "输入拳法代表的数字进行猜拳:" game
# ai=$[$RANDOM%3+1]
# echo "机器人出拳为:$ai"
#
# if [ $game -gt 3 -o $game -eq 0 ];then
# echo "请输入合法数字"
# exit 1
# fi
# if [ $ai -eq 1 ];then
# if [ $game -eq $ai ];then
# echo "平局"
# elif [ $game -eq 2 ];then
# echo "你输了"
# else
# echo "你赢了"
# fi
# fi
# if [ $ai -eq 2 ];then
# if [ $game -eq $ai ];then
# echo "平局"
# elif [ $game -eq 3 ];then
# echo "你输了"
# else
# echo "你赢了"
# fi
# fi
# if [ $ai -eq 3 ];then
# if [ $game -eq $ai ];then
# echo "平局"
# elif [ $game -eq 1 ];then
# echo "你输了"
# else
# echo "你赢了"
# fi
# fi
#done

11: 让 192.168.4.0/24 整个网段中那些主机处于开机状态, 那些处于关机状态(for while 多进程 实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#for循环
for i in {1..254};do
ping -c2 -W1 192.168.249.$i >/dev/null
if [ $? -eq 0 ];then
echo "192.168.249.$i 上线"
else
echo "192.168.249.$i 下线"
fi
done

---

while [ $i -le 254 ];do
ping -c2 -W1 192.168.254.$i >dev/null
if [ $? -eq 0 ];then
echo "192.168.249.$i 上线"
else
echo "192.168.249.$i 下线"
fi
done

---


myping(){
ping -c2 -W2 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 上线"
else
echo "$1 下线"
fi
}

for i in {1..254};do
myping 192.168.249.$i &
done
#使用 & 将执行放在后台执行
#这样做的好处是不需要等待ping第一台主机的回应, 就可以继续并发执行第二台 以此类推

12:编写脚本 显示进度条

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#echo -n 不换行输出
jindu(){
while true;do
echo -n "#"
sleep 0.2
done
}
jindu &
cp -a /usr/ /tmp
killall $!
echo "拷贝完成"

13: 进度条 动态时钟脚

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
jindu(){
sp=0.1
count=0
while true;do
count=$[$count+1]
case $count in
1)
echo -e "-\b\c"
sleep $sp
;;
2)
echo -e '\\'"\b\c"
sleep $sp
;;
3)
echo -e "|\b\c"
sleep $sp
;;
4)
echo -e "/\b\c"
sleep $sp
;;
*)
count=0
esac
done
}
jindu

14: 9*9 乘法表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#!/bin/bash

#for i in {1..9};do
# for((j=1;j<$i+1;j++));do
# echo -e "$i"x"$j""=""$(($i*$j)) \c"
# done
# echo -e "\n"
#done

for i in `seq 9`;do
for j in `seq $i`;do
echo -n "$i*$j=$[i*j] "
done
echo
done

15: 使用死循环实时显示 ens33 网卡发送的数据包流量

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
read -p "输入要观察的网卡:" net
if [ -z $net ];then
echo "不能为空"
exit 1
fi
while true;do
echo " 发送流量: `ifconfig $net | grep "RX packets" | awk '{print $6,$7}'`"
echo " 接受流量: `ifconfig $net | grep "TX packets" | awk '{print $6,$7}'`"
echo "-----------"
sleep 1
done

16: 使用user.txt 文件中的人员名单,在计算机中自动创建对应的用户并配置初始密码

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

read -p "输入初始化密码:" pw
for i in `cat user.txt`;do
useradd $i && echo $pw | passwd $i --stdin
if [ $? -eq 0 ];then
echo "创建用户:$i; 密码为:$pw"
else
echo "创建用户:$i 失败"
fi
done

17: 编写批量修改扩展名脚本,如 批量将txt文件修改为doc文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

read -p "输入需要批量修改的目录:" dir
read -p "输入修改的目标后缀:" suffix
read -p "输入要修改成的后缀: " tag

##rename方法简单方便
$cd $dir
$rename $suffix $tag *

##sed mv 重命名方法
for i in `ls $dir`;do
mv $dir/$i $dir/$(echo $i | sed s@$suffix@$tag@)
done

18: 使用expect 工具自动交互密码远程其他主机安装httpd

1
2
3
#!/bin/bash
#使用ansible
ansible node -m yum -a 'name=nginx'

19: 编写一个脚本点名器

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 提前准备一个txt文件,该文件中需要包含所有姓名的信息,一行一个姓名, 脚本每次随机显示一个姓名

while;do
#统计user文件中有多少用户
line=`cat user.txt | wc -l`
num=$[RANDOM%line+1]
sed -n "${num}p" user.txt
sleep 0.2
done

20: 查看有多少远程的ip在连接本机,(不管是ssh还是http 还是ftp)

1
2
3
#!/bin/bash
#省略前2行, sed -n '3,$p' , awk 'NR>2'
netstat -ant | awk '{print $5}' | sed -n '3,$p' | sort -nr | uniq -c

21: 对100以内的所有正整数相加求和

1
2
3
4
5
6
#!/bin/bash
j=0
for i in {1..100};do
j=$[j+=i]
done
echo $j

22: 统计09:36-09:37 所有访问nginx服务器的请求有多少个 | 统计ip 有多少

1
2
3
#!/bin/bash

awk -F ":" '$2":"$3 > "09:36" && $2":"$3 <= "09:37"{print $1}' mobile.haoqipei.com.log | awk '{print $1}' | sort -n | uniq -c

23: 打印国际象棋棋盘

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

for i in {1..8};do
for j in {1..8};do
sun=$[i+j]
if [ $[sun%2] -eq 0 ];then
echo -en "\033[46m \033[0m"
fi
echo -en "\033[47m \033[0m"
done
echo
done

24: 统计每个远程ip访问真机nginx 多少次?

1
2
3
#!/bin/bash

awk '{ip[$1]++}END{for (i in ip) print ip[i],i}' mobile.haoqipei.com.log

25: 统计当前linux系统中可以登录计算机的账户有多少?

1
2
#!/bin/bash
#grep -v "nologin" /etc/passwd | wc -l

26: 统计/var/log 有多少文件 并显示这些文件名

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

sum=0
#cd /var/log/
for i in `ls -r /var/log/*`;do
if [ -f $i ];then
let num++
echo "文件名: $i"
fi
done
echo "文件总数为 $num"

27: 自动为其他脚本添加解释器信息, #!/bin/bash

1
2
3
4
5
#!/bin/bash

if ! grep -q '#!/bin' $!;then
sed '1i #!/bin/bash' $1
fi

28: 切割nginx日志

1
2
3
4
5
6
7
8
#!/bin/bash

nginx_log_path="/var/log/nginx/"

mv ${nginx_log_path}access.log ${nginx_log_path}access_$(date +%F).log

kill -USER1 `cat /run/nginx.pid`

29: 检测mysql 数据库连接量

1
2
3
4
5
6
7
8
9
#!/bin/bash
log_file=/tmp/mysql_login.log
user=root
passwd=123456
while true;do
mysqladmin -u"$user" -p"$passwd" status | awk '{print $4}' >> $log_file
sleep 2
done

30: 根据md5 校验码, 检测文件是否被修改

1
2
3
4
5
#!/bin/bash
for i in `ls /etc/*conf`;do
md5sum "$i" >> /var/log/md5.log
done

40: 检测mysql服务是否存活

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
user=root
passwd=passwd

mysqladmin -u$user -p$passwd ping &>/dev/null
if [ $? -eq 0 ];then
echo "mysql 启动状态"
else
echo "mysql 没有启动"
fi

41: 备份mysql的shell脚本(mysqldump)

1
2
3
4
5
6
7
8
9
#!/bin/bash

user=root
passwd=passwd
db=testdb

[ ! d /mysqlback ] && mkdir /mysqlback
mysqldump -u$user -p$passwd $db > /mysqlback/$db.sql

42: 将文件中所有的小写字母转行为大写字母

1
2
3
4
5
6
7
8
#!/bin/bash

read -p "输入需要转行的文件:" file

tr [a-z] [A-Z] < $file

#写入文件
cat test.sh | tr [a-z] [A-Z] >> test.sh

43: 非交互自动生成ssh密钥

1
2
3
4
5
6
#!/bin/bash
#
rm rf ~/.ssh/*

ssh-keygen -t RSA -N '' -f ~/.ssh/id_rsa

44: 检测特定的软件是否已经安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
read -p "输入要检测的软件:" pack

if [ -z $pack ];then
echo "不能为空"
exit 1
fi

rpm -q $pack &>/dev/null
if [ $? -eq 0 ];then
echo "已安装"
else
echo "没有安装"
exit 1
fi

45:监控http服务器的状态(测试返回码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

url="https://h5.haoqipei.com"
sum=0
while true;do
sleep 10;
code=$(curl -m 5 -o /dev/null -s -w %{http_code} $url)
if [ $code -lt 200 ];then
let sum+=1
if [ $sun -gt 3 ];then
echo "网络失联30s, 请检查 http 服务"
unset sum
exit 1
fi
fi

done


46: 显示cpu 厂商信息

1
2
#!/bin/bash
awk '/vendor_id/{print $3}' /proc/cpuinfo | uniq

47: 删除某个目录大小为0 的文件

1
2
3
4
5
#!/bin/bash
dir=/usr/share

find $dir -type f -szie 0 -exec rm -rf {} \;

48: 查找linux 系统中的僵尸进程

1
2
3
#!/bin/bash
ps aux | awk '{if($8 == "Z"){print $2,$11}}'

49: 提示用户输入年份后测试判断是否为闰年

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
#能被4整除 并且并100整除的年是闰年
#能被400整除的年也是闰年

read -p "输入年份:" year

if [ "$year" == "" ];then
echo "输入有效年份"
exit
fi
#使用正则测试变量 year中是否包含大小写字母

if [[ "$year" =~ [a-z] ]];then
echo "输入的不是数字"
exit
fi

if [ $[$year % 4] -eq 0 ] && [ $[$year % 100] -ne 0 ];then
echo "$year是闰年"
elif [ $[year % 400] -eq 0];then
echo "$year是闰年"
else
echo "$year不是闰年"
fi

50: 生成随机密码, urandom版本

1
2
3
4
5
6
7
8
9
#!/bin/bash
#/dev/urandom 是linux 内置的随机设备文件
# cat /dev/urandom 查看文件内容.
#查看该文件后 发现内容有些太随机,包含很多特殊符号 我们需要的密码 不希望使用这样的符号,
# tr -dc '_A-Za-z9-9' < /dev/urandom
# 该命令可以将随机文件中的其他字符删除, 仅保留大小写字母 数字 下划线, 但是内容还是太多,
# 我们可以继续吧优化好的内容 通过管道传递给 head 命令, 在大量数据中仅显示头10个字节,
# 注意A 前面有个下划线
tr -dc '_A-Za-z0-9' </dev/urandom | head -c 10

51: 随机生成密码

1
2
3
4
5
6
7
#!/bin/bash
#uuid版本,16进制密码
uuidgen

#进程id版本 数字密码
echo $$

52: shell脚本的fork炸弹

1
2
3
4
5
6
7
8
9
#!/bin/bash

#快速消耗计算机资源, 指使计算机死机,
#定义函数名为.(点) 函数中的递归调用自己并放入后台执行
.(){
.|.&
};
.

53: 批量下载有序文件

1
2
3
4
5
6
7
#!/bin/bash
url=www.baidu.com
type=jpg
for i in `seq 100`;do
curl $url/$i.$type -o /tmp/$i.$type
sleep 2
done

54: 显示当前计算机中所有账户的用户名称

1
2
3
4
#!/bin/bash
# awk -F':' '{print $1}' /etc/passwd
# cut -d':' -f1 /etc/passwd
# sed "s/:.*//" /etc/passwd

55: 制定目录路径, 脚本自动将该目录使用tar命令打包备份到/data目录

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

read -p "输入要打包的目录路径(绝对路径):" dir

if [ ! -d $dir ];then
echo "目录不存在"
fi

tar zcvf /tmp/$dir.tar.gz $dir

56: 显示进度条(回旋镖版本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

while true;do
clear
for i in `seq 20`;do
echo -e "\033[3;${i}H*"
sleep 0.1
done
for i in {20..1};do
echo -e "\033[3;${1}H*"
sleep 0.1
done
clear
done

57: 循环关闭局域网中所有主机

1
2
3
4
5
6
7
8
#!/bin/bash
ip=90
for i in {1..254};do
if [ $i -ne $ip ];then
echo "正在关闭 192.168.249.$i..."
ssh 192.168.249.$i poweroff
fi
done

58: 获取本机mac地址

1
2
#!/bin/bash
ip a show ens33 | awk '/link\/ether^Cprint $2}'

59: 修改linux 系统里最大打开文件数量

1
2
3
4
5
6
#!/bin/bash
#往/etc/secruity/limits.conf 文件的末尾追加两行配置参数, 修改最大打开文件数量为 65536
cat >> /etc/security/limits.conf << EOF
* soft nofile 65536
* hard nofile 65536
EOF

60: 自动修改计划任务配置文件

1
2
3
4
5
6
7
8
#!/bin/bash
read -p "输入分钟信息(00-59):" min
read -p "输入小时信息(00-24):" hour
read -p "输入日期信息(01-31):" date
read -p "输入月份信息(01-12):" month
read -p "输入星期信息(00-06):" weak
read -p "输入要执行的命令或者脚本:" program
echo "$min $hour $date $month $weak $program" >> /etc/crontab

61: 找出/etc/passwd 中能登录的用户, 并将对应在/etc/shadow 中第二列密码提出处理

1
2
3
4
5
6
7
8
#!/bin/bash
#!/bin/bash
#awk -v 把外部变量影射为内部变量
user=`awk -F':' '{print $1}' /etc/passwd`
for i in $user;do
# awk -F: -v x=$i '$1==x{print $1,$2}' /etc/shadow #awk '' 单引号不识别变量 所以用赋值的方式 去条件里面判断
awk -F':' '/${i}/{print $1,$2}' /etc/shadow # 这种方式不行, $i 不识别
done

62: 使用脚本循环创建 三位数的文本文件 (111-999的文件)

1
2
3
4
5
6
7
8
9
#!/bin/bash
mkdir -p /tmp/testnum
for i in {1..99};do
for j in {1..99};do
for k in {1..99};do
touch /tmp/testnum/${i}${j}${k}.txt
done
done
done

63: 统计/etc/passwd 中root 出现的次数

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

#awk -F':' '{i=1;while(i<=NF){if($i~/root/){x++};i++}}END{print "root 出现次数为 x"}' /etc/passwd
sum=0
for i in `awk -F'/' '{print $NF}' /etc/passwd`;do
if [ $i == "nologin" ];then
let sum++
fi
done
echo $sum

64: 统计linux进程相关的数量信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
running=0
sleeping=0
stoped=0
zombie=0

for i in /proc/[1-9]*;do
tatus=`awk '{print $3}' $i/stat`
case $tatus in
R)
running=$[running+1];;
T)
stoped=$[stoped+1];;
S)
sleeping=$[sleeping+1];;
Z)
zombie=$[zombie+1];;
esac
done

echo "运行的:$running sleep的:$sleeping stop的:$stoped zeom的:$zombie"

65: 判断用户输入的数据类型,

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
read -p "请输入一个字符:" key
case $key in
[a-z]|[A-Z])
echo "输入的是一个字母";;
[0-9])
echo "输入的是一个数字";;
*)
echo "输入的是空格或功能键字符"
esac

66: 打印斐波那契数列 (该数列的特点是最后一个数字 永远都是前2个数字之和)

1
2
3
4
5
6
7
8
#!/bin/bash
#斐波那契数列最后一个数字永远是前2个数字之和
#如: 0 1 1 2 3 5 8 13
list=(0 1)
for i in `seq 2 11`;do
list[$i]=`expr ${list[-1]} + ${list[-2]}`
done
echo ${list[@]}

67: 判断用户输入的是yes还是no

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
read -p "输入yes或者no:" sure

case $sure in
yes|y|Y|yes)
echo "输入的是yes";;
no|NO|N|n)
echo "输入的是no";;
*)
echo "error"
esac

68: 显示本机上linux系统上所有的开发的端口列表

1
2
3
#!/bin/bash
netstat -tlunp| awk '{print $1,$4}'|awk -F':' '{print "协议"$1,"端口"$NF}'| grep "[0-9]"| uniq

69: 将linux系统中UID 大于1000的用户都删除

1
2
3
4
5
#!/bin/bash
user=`awk -F':' '$3>=1000{print $1}' /etc/passwd`
for i in $user;do
userdel -r $i
done

70: 使用脚本打印如下图像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash

#第一个图像

for((i=1;i<=9;i++));do
for((j=1;j<=i;j++));do
echo -n $i
done
echo ""
done

read -p "按任意键继续" key

for((i=1;i<=9;i++));do
for((j=1;j<=i;j++));do
echo -n "|"
done
echo "_"
done

read -p "按任意键继续" key

for i in {1..10};do
for((j=1;j<=i;j++));do
echo -n "*"
done
echo ""
done
for((i=10;i>=1;i--));do
for((j=1;j<=i;j++));do
echo -n "*"
done
echo ""
done

71: 根据计算机当前时间, 返回问候语, 可以将脚本设置为开机自启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
tm=`date +%H`

if [ $tm -le 12 ];then
msg="早上好"
elif [ $tm -gt 12 -a $tm -le 18 ];then
msg="中午好"
else
msg="晚上好"
if

echo "当前时间是: $(date +%F-%H:%M:%S)"
echo -e "\033[34m$msg\033[0m"

72: 读取用户输入的账户名称, 将账户名写入到数组保存

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
i=0
while true;do
read -p "输入用户名 保存到数组:" name
if [ $name == "over" ];then
break
else
name_arr[$i]=$name
let i++
fi
done
echo "总账户数量为 ${#name_arr[*]}"
echo "${name_arr[*]}"

73: 判断文件或目录是否存在

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

read -p "输入目录或者文件:" dir

if [ -f $dir ];then
echo "该文件存在"
ls -l $dir
elif [ -d $dir ];then
echo "该目录存在"
ls -ld $dir
fi

74: 打印各种时间格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
echo "显示星期简称(如: Sun)"
date +%a
echo "显示星期全程(如: sunday)"
date +%A
echo "显示月份简称(如: jan)"
date +%b
echo "显示月份全称(如: january)"
date +%B
echo "显示数字月份(如: 12)"
date +%m
echo "显示当前分钟"
date +%M
echo "显示当前数字日期"
date +%d
#更多查百度吧

75: 使用egrep 过滤mac地址

1
2
3
4
#!/bin/bash

ip a show ens33 | egrep -o "[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}"

76: 使用awk编写wc程序

1
2
3
4
5
6
7
#!/bin/bash
#自定义变量chars 变量存储字符个数,自定义变量 words 变量存储单词个数
#awk 变量内置NR存储行数
#length()为awk内置函数, 用来统计每行的字符数量, 因为每行都会有一个隐藏的$, 所以每次统计后都+1
#awk程序会把文件结尾符$也统计在内,可以使用 cat -A 文件名, 查看隐藏字符
awk '{chars+=length($0)+1;words+=NF} END{print NR,words,chars}' $1


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!