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

相关推荐

  • 文本处理-vim编辑器

    命令格式、(1)模式、(2)关闭文件、(3)可视化模式、(4)使用多个“窗口”、(5)定制vim的工作特性、(6)示例

    2018-03-13
  • ☞磁盘管理{分区表备份与恢复;修复fstab记录错误;制作swap分区;磁盘配额演示;}

    磁盘管理{ 分区表备份与恢复;错误fstab修复;swap分区;磁盘配额;}

    Linux干货 2016-09-04
  • N23_第六周

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#;:%s/^[[:blank:]]\+.*/\0#/g 2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白字符;:%s/^[[:space:]]\+/…

    Linux干货 2017-02-28
  • 第十六周作业

    1、源码编译安装LNMP架构环境;     安装nginx:      1)安装依赖包 ]# yum groupinstall “Development Tools” “Development Libraries” -y ]# yum install wget openssl-devel ncurses-de…

    2017-05-02
  • Linux基础知识之cp mv rm

    该博文以CentOS6.8_x86_64系统为基础,Xshell 5远程连接CentOS系统,以root身份登录系统和sjsir普通用户身份登录系统。 为什么要学习cp、mv、rm命令?     cp、mv、rm命令为Linux系统使用最长使用的三个命令之一,复制、移动和删除是我们平时处理一些文件必须要学会的命令,应该用于熟练掌握和使用的…

    Linux干货 2016-07-29
  • 内核编译流程和自动化安装

    内核编译         在特定的情况我们机器上面有些硬件特性需要利用起来,但是我们现成的这个内核没有开启这个功能,那就需要重新编译,把这个功能模块加进来,或者打到vmlinux中的核心文件里面。比如ntfs功能,默认系统没有启用此功能,但是系统是带这个功能的,编译的时候时候可以…

    Linux干货 2016-09-18