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

相关推荐

  • ansible

    运维工具介绍 Ansible Ansible优点:  Agentless       (去中心化)  Stupied Simple (上手简单,学习曲线平滑)  SSH by default (安全,无需安装客户端)  YAML no code,定制剧本 (语法简单,维护方便) 自动工具衍…

    Linux干货 2017-05-23
  • HA Cluster:keepalived

    HA Cluster 集群类型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP 系统可用性的公式:A=MTBF/(MTBF+MTTR) 系统故障: 硬件故障:设计缺陷、wear out、自然灾害 软件故障:设计缺陷 提升系统高用性的解决方案之降低MTTR: 解决方案:冗余(redundant) acti…

    Linux干货 2017-06-26
  • Linux终端类型

    Linux中各种终端的解释 设备终端   键盘鼠标显示器 物理终端( /dev/console ) )   在Linux 系统中,计算机显示器通常被称为控制台终端(Console)。 虚拟终端(tty :teletypewriters, /dev/tty# # 为[1-6])   tty 可有n 个,Ctrl+Alt+…

    Linux干货 2016-10-13
  • Linux源码包安装详解

    安装源码包 安装一个源码包,是需要我们自己把源代码编译成二进制的可执行文件。如果你读得懂这些源代码,那么你就可以去修改这些源代码自定义功能,然后再去编译成你想要的。使用源码包的好处除了可以自定义修改源代码外还可以定制相关的功能,因为源码包在编译的时候是可以附加额外的选项的。 源码包的编译用到了linux系统里的编译器,常见的源码包一般都是用C语言开发的,这也…

    Linux干货 2016-09-06
  • Linux基础知识(五)-文件查找命令find

    对grep 和 find 命令的操作 1、显示当前系统上root、fedora或user1用户的默认shell; 2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello(); 3、使用echo命令输出一个路径,使用grep取出其基名; 4、找出ifconfig命令结果中的1-255之间数字; 5、写一个…

    Linux干货 2016-10-24
  • 文件查找作业

    1、查找/var目录下属主为root,且属组为mail的所有文件 [root@wzc ~]# find /var/ -user root -a -group mail /var/spool/mail /var/spool/mail/root 2、查找/var目录下不属于root、…

    Linux干货 2016-08-15