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 "你輸入的數太?。?quot;;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.www58058.com/38056

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

相關推薦

  • 編寫腳本

        1、  編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPV4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。                      …

    2017-04-13
  • mysql備份與恢復

    1、mysqldump進行mysqll數據庫的備份與還原 命令說明: Schema和數據存儲一起、巨大的SQL語句、單個巨大的備份文件 mysqldump: 客戶端,通過mysql協議連接至mysqld; mysqldump [options] [db_name [tbl_name …]] shell> mysqldump [options] db…

    Linux干貨 2017-03-27
  • 磁盤管理

    磁盤設備 一切皆文件 所有的Linux中的設備都可以使用下面命令進行操作:open(), read(), write(), close()(這些是C的函數) 塊設備:隨機訪問 字符設備:線性訪問 設備號碼: 主設備號:major number,標識設備類型 8是主要設備編號,代表類型 次設備號:minor number…

    Linux干貨 2016-09-01
  • N22-妙手-第一周博客作業

           描述計算機的組成及其功能 1946年馮諾依曼提出馮 諾依曼結構,也稱普林斯頓結構,即一種將程序指令存儲器和數據存儲器合并在一起的存儲器結構。根據他的結構,計算機組成是: (1)運算器:負責數據的算術運算和邏輯運算 (2)控制器:  負責對程序信息和數據進行分析,控制并協調其輸…

    Linux干貨 2016-08-15
  • 第三周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可 who |cut -d ' ' -f1 |sort|uniq 2、取出最后登錄到當前系統的用戶的相關信息 last|head -1 3、取出當前系統上被用戶當作其默認shell的最…

    Linux干貨 2016-12-26
  • 文本處理三劍客之 Sed

         Sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed主要用來自…

    2017-08-26
欧美性久久久久