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
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
效果:
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
效果:
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