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.www58058.com/38056

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

相關推薦

  • Linux下文件權限管理輕微總結

    Linux下文件權限管理輕微總結       此文對linux下文件的權限及其如何管理權限進行介紹,涉及到讀“r”寫“w”執行“x”三個權限,特殊權限SUID、SGID、STICKY、ACL、attr的使用。同時對更改文件的指令chmod、getfacl、setfacl、chattr、lsattr等進行說明。  &nb…

    Linux干貨 2016-11-07
  • mysql or條件可以使用索引而避免全表

    在某些情況下,or條件可以避免全表掃描的。 1 .where 語句里面如果帶有or條件, myisam表能用到索引, innodb不行。 1)myisam表:  CREATE TABLE IF NOT EXISTS `a` (   `id` int(1)&nb…

    Linux干貨 2015-04-13
  • shell腳本編程之變量

    一、創建shell腳本文件   創建shell腳本時,必須在第一行指定要使用的shell。格式為:   #!/bin/bash   通常在shell腳本中,#代表注釋行,即不被執行的行,而第一行“#!”則是表示用哪個shell來執行腳本。   實例:   讓我們來執行一下這個腳本:   上面的結果顯…

    Linux干貨 2016-02-14
  • 網卡名稱更改

    網卡是計算機進行網絡通信的必須的設備。在CentOS6及其更早的系統中,網卡設備在系統中的名稱命名為eth#(#為0,1,2…之類的數字)。在內核版本為3.0.0及其以后的Linux發行版中,網卡設備在系統中名稱變得很長,變得不好識別以及不利于管理。為了更好的管理,我們將新的網絡設備命名改為傳統的命名。 網卡名稱更改 在CentOS系統中操作 在RHEL7系…

    Linux干貨 2016-11-23
  • Linux三劍客之sed

    sed 簡介 sed 工作原理 命令格式 常用選項: 地址定界: 編輯命令: 替換標記: sed元字符集(正則表達式) 高級編輯命令: sed用法實例 作業: 選定行的范圍:,(逗號) 刪除操作:d命令 顯示模式空間內容 追加(行下):a\命令 插入(行上):i\命令 退出:q命令 多點編輯:e命令 從文件讀入:r命令 寫入文件:w命令 替換操作:s命令 替…

    Linux干貨 2016-08-11
  • 用戶組和權限管理的相關命令

    1,useradd  新建用戶 useradd -u uid username 創建用戶時指定uid(如不指定則Centos:500-60000, Centos7: 1000-60000) -o -u uid username  創建用戶時指定uid(可以與已存在用戶的uid相同) -g groupname username 創…

    2017-07-25
欧美性久久久久