bash脚本进阶(续)

 1、打印99乘法表

[root@ _212_ ~/bin/for_script]# cat 99_changfa.sh 
#!/bin/bash
line=1
for i in `seq 1 9`;
        do
                for k in `seq 1 $i`;
                        do
                         echo -ne "${k}*${i}"="$[$k*$i]\t"
                        done
                 echo 
        done
[root@ _213_ ~/bin/for_script]# bash 99_changfa.sh
1*1=1 
1*2=2 2*2=4 
1*3=3 2*3=6 3*3=9 
1*4=4 2*4=8 3*4=12 4*4=16 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

2、利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者

[root@ _216_ ~/bin/while]# cat max_min_while.sh 
#!/bin/bash
i=1
max=0
min=1000000000
while [ $i -le 10 ];
 do
  num=$RANDOM
  echo "$num"
  if [ $max -lt $num ];then
   max=$num
  fi
  if [ $min -gt $num ];then
   min=$num
  fi
  ((i++))
 done 
echo "max $max"
echo "min $min"
[root@ _217_ ~/bin/while]# bash max_min_while.sh
14389
18911
31203
16978
21504
21511
16971
2581
30942
25937
max 31203
min 2581

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

[root@ _245_ ~/bin/8-17_study]# cat login_user.sh
#!/bin/bash
until false;
 do
  if who|grep -q "^hacker ";then
   echo "`who|grep "^hacker "`  记载时间:`date`">> /var/log/login.log
   echo "Please logout"|write hacker &>/dev/null
  fi
  sleep 3
 done

login_hacker.gif

4、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出。

[root@ _249_ ~/bin/8-17_study]# cat num_games.sh
#!/bin/bash
ram=$[${RANDOM}%10]
until false;
 do
  read -p "输入10以内正整数:" num
  [ $num -eq $ram ] && { echo "猜数相等!"; exit; }
  [ $num -lt $ram ] && { echo "你输入的数太小!";continue; }
  [ $num -gt $ram ] && { echo "你输入的数太大!!";continue; } 
 done
[root@ _250_ ~/bin/8-17_study]# bash num_games.sh 
输入10以内正整数:1
你输入的数太小!
输入10以内正整数:3
你输入的数太小!
输入10以内正整数:5
你输入的数太小!
输入10以内正整数:8
你输入的数太大!!
输入10以内正整数:7
你输入的数太大!!
输入10以内正整数:6
猜数相等!

5、扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话为62985600,并提示该用户的GECOS信息修改成功

[root@ _252_ ~/bin/8-17_study]# cat GENCOS.sh 
#!/bin/bash
while read line;
 do
  note=`echo "$line" | cut -d: -f5`
  usr_name=`echo $line | cut -d: -f1`
  [[ -z $note ]] && chfn -h 62985600 -f 62985600 $usr_name &> /dev/null && echo "$usr_name  GECOS 信息修改成功!" 
 done < /etc/passwd

6、

1、写一个服务脚本/root/bin/testsrv.sh,完成如下要求
(1) 脚本可接受参数: start, stop, restart, status
(2) 如果参数非此四者之一,提示使用格式后报错退出
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
考虑:如果事先已经启动过一次,该如何处理?
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
考虑:如果事先已然停止过了,该如何处理?
(5) 如是restart,则先stop, 再start
考虑:如果本来没有start,如何处理?
(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示
“ SCRIPT_NAME is running...”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“ SCRIPT_NAME
is stopped...”
其中: SCRIPT_NAME为当前脚本名
#!/bin/bash

script_name=`basename $0`
Time=`date +%F-%H-%M:%S`
_start(){
if [ -a /var/lock/subsys/$script_name ];then
 printf "$Time   $script_name already Start \n"
else
 touch /var/lock/subsys/$script_name
 printf "$Time   $script_name start Successfully! \n"
fi
}
_stop(){
if ! [ -a /var/lock/subsys/$script_name ];then
 echo "$Time   Warning: $script_name is no Running..."
else
 rm -rf /var/lock/subsys/$script_name
 printf "$Time   $script_name Stop Success!\n"
fi
}
_restart(){
_stop 
_start
}
_status(){
if [ -a /var/lock/subsys/$script_name ];then
 printf "$Time   $script_name is Running...\n"
else
 printf "$Time   $script_name is Stopped...\n"
fi
}

[ $# -ne 1 ] && {  echo -e "Input a arguments!\nUsage: $script_name < option > | start | stop | restart | status ]"; exit; }
case "$1" in
start)
 _start
 ;;
stop)
 _stop
 ;;
restart)
 _restart
 ;;
status)
 _status
 ;;
*)
 echo "Usage: $script_name < option > | start | stop | restart | status ]";exit
 ;;
esac

效果:

start.gif

7、

编写一个脚本/root/bin/copycmd.sh
(1) 提示用户输入一个可执行命令名称;
(2) 获取此命令所依赖到的所有库文件列表
(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下;
如: /bin/bash ==> /mnt/sysroot/bin/bash
/usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd
(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下:
如: /lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ldlinux-x86-64.so.2
(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命
令,并重复完成上述功能;直到用户输入quit退出
#!/bin/bash

until false;
 do
  read -t 30 -p "输入一个可执行命令名称:" cmd
  [[ $cmd == quit ]] && break
  which $cmd &> /dev/null
  [ $? -ne 0 ] && { echo "找不到你输入的命令的文件路径!";continue; }
  cmd_path=`which $cmd |tail -1`
  mkdir -p /mnt/sysroot`dirname $cmd_path` &> /dev/null
  echo "创建目录:/mnt/sysroot`dirname $cmd_path`"
  cp -p $cmd_path /mnt/sysroot`dirname $cmd_path` &> /dev/null
  echo "复制命令文件:$cmd_path 到 /mnt/sysroot`dirname $cmd_path`"
  echo "CAPABILITY:"
  for capability in `ldd /bin/ls |grep "/" |sed -r 's#[^/]*(/[^[:space:]]*)[[:space:]].*#\1#'`;
   do
    mkdir -p /mnt/sysroot`dirname $capability` &> /dev/null
    cp -p $capability /mnt/sysroot`dirname $capability` &> /dev/null
    echo "复制  $capability 到 /mnt/sysroot`dirname $capability` 下"
   done
 done

效果:

 GIF.gif

8、斐波拉契数列

[root@ _274_ ~/bin/function_di]# cat fibonacci.sh 
#!/bin/bash
read -t 30 -p "输入兔子繁殖代数:" num
fibonacci(){
i=$1
a1=1
a2=1
if [ $1 -eq 0 ];then
 echo "0"
elif [ $i -eq 1 -o $i -eq 2 ];then
 echo "1"
else
 while [ $i -ge 3 ]
  do
   an=`echo "$a1+$a2"|bc`
   a1=$a2
   a2=$an
   ((i--))
  done
 echo "$an"
fi
}
for k in `seq 0 $num`;
 do
  echo -n "兔子繁殖$k代后总数为:"
  fibonacci $k
 done

[root@ _275_ ~/bin/function_di]# bash fibonacci.sh
输入兔子繁殖代数:8
兔子繁殖0代后总数为:0
兔子繁殖1代后总数为:1
兔子繁殖2代后总数为:1
兔子繁殖3代后总数为:2
兔子繁殖4代后总数为:3
兔子繁殖5代后总数为:5
兔子繁殖6代后总数为:8
兔子繁殖7代后总数为:13
兔子繁殖8代后总数为:21

递归:
[root@ _297_ ~/bin/function_di]# cat fibo.sh
#!/bin/bash
fact(){
if [ $1 -eq 0 ];then
 echo 0
elif [ $1 -eq 1 ];then
 echo 1
else
 echo "$[`fact $[$1-1]`+`fact $[$1-2]`]"
fi
}
fact 8
[root@ _298_ ~/bin/function_di]# bash fibo.sh
21

9、汉诺塔

[root@ _299_ ~/bin/function_di]# cat hanoi.sh 
#!/bin/bash
i=1
hanoi(){
if [ $1 -eq 1 ];then
 printf "$i步: $1  $2 --> $4\n"
 ((i++))
else
 hanoi $[$1-1] $2 $4 $3
 printf "$i步: $1  $2 --> $4\n"
 ((i++))
 hanoi $[$1-1] $3 $2 $4
fi
}
read -p "input:" num
hanoi $num A B C
[root@ _300_ ~/bin/function_di]# bash hanoi.sh
input:4
1步: 1  A --> B
2步: 2  A --> C
3步: 1  B --> C
4步: 3  A --> B
5步: 1  C --> A
6步: 2  C --> B
7步: 1  A --> B
8步: 4  A --> C
9步: 1  B --> C
10步: 2  B --> A
11步: 1  C --> A
12步: 3  B --> C
13步: 1  A --> B
14步: 2  A --> C
15步: 1  B --> C

 

原创文章,作者:M20-1--孔祥文,如若转载,请注明出处:http://www.178linux.com/38056

赞 (0)
M20-1--孔祥文M20-1--孔祥文
上一篇 2016-08-21 20:46
下一篇 2016-08-21 20:46

相关推荐

  • iptables防火墙

    Linux防火墙基础 在Internet中,企业通过架设各种应用系统来为用户提供各种网络服务,例如Web网站,电子邮件系统,FTP服务器,数据库系统等等,而防火墙就是用来保护这些服务器,过滤企业不需要的访问甚至是恶意的入侵。 Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙。Linux防火墙体系基于内核编码实…

    Linux干货 2017-01-10
  • DNS 笔记

    Ø DNS查询。工作流程如下图         n  客户端的DNS:8.8.8.8 /etc/hosts  14.215.177.38 www.baidu.com n  客户端访问www.baidu.com 不用向DSN服务器发生查询,只需要查询本地的 /e…

    Linux干货 2016-08-15
  • Linux帮助文件的使用、history变量的使用和FHS

    怎样利用帮助文件来查询想要了解的信息? 这里以通过查找帮助文件来修改登陆信息为例子, 登陆的时候,我们可以看到CentOS的的版本和内核信息, 当我们查看该相关文件的时候,会发现,里面的文档和显示的不一致,由此可以了解到,该文档是调用某些参数来实现显示CentOS的版本和内核信息。 这个时候,我们该怎样去查看issue文档的相关信息? 首先我们可以查看一下通…

    Linux干货 2016-08-04
  • varnish的基本配置

    主程序:varnish 配置文件: ·/etc/varnish/varnish.params—配置varnish服务进程的工作特性,例如监听的地址和端口,缓存机制; ·/etc/varnish/default.vcl—配置各Child/Cache线程的缓存工作属性; VCL状态引擎: 内建变量: ·req.*:request,表示由客…

    2017-08-08
  • 基于ansible role实现LAMP平台批量部署

    前言 作为运维人员,当面对几十台或上百台服务器需要修改某个参数或部署某个平台,你将从何入手呢?ansible的出现很好的解决了这一困扰,ansible基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。本文带来的是基于Ansible Role…

    Linux干货 2015-06-11
  • 进程管理,计划任务

    一、进程相关概念及系统管理工具     进程概念         内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、 安全功能等         P…

    Linux干货 2016-09-18