掃描/etc/passwd文件每一行,如發現GECOS字段為空,則填充用戶名和單位電話為62985600,并提示該用戶的GECOS信息修改成功。
[root@localhost sh.log]# cat whileGECOS.sh #!/bin/bash #author:DYW #掃描/etc/passwd文件每一行,如發現GECOS字段為空,則填充用戶名和單位電話62985600,并題提示該用戶GECOS信息修改成功 while read i;do GECOS=`echo $i|cut -d: -f5` if [[ -z "$GECOS" ]];then name=`echo $i|cut -d: -f1` chfn -f $name $name &> /dev/null chfn -p 62985600 $name &> /dev/null echo "$name GECOS wan modified" fi done < /etc/passwd [root@localhost sh.log]# bash whileGECOS.sh postfix GECOS wan modified wang GECOS wan modified laowang GECOS wan modified xiaodeng GECOS wan modified gdm GECOS wan modified [root@localhost sh.log]# getent passwd root:x:0:0:root,,62985600:/root:/bin/bash ..... postfix:x:89:89:postfix,,62985600:/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin wang:x:1000:1000:wang,,62985600:/home/wang:/bin/bash laowang:x:1001:1001:laowang,,62985600:/home/laowang:/bin/bash xiaodeng:x:1002:1002:xiaodeng,,62985600:/home/xiaodeng:/bin/bash gdm:x:1003:1003:gdm,,62985600:/home/gdm:/bin/bash
寫一個函數庫實現加減乘除
[root@localhost function]# cat funs #!/bin/bash jia() { local a=$[$1+$2] echo "$a" } jian() { local b=$[$1-$2] echo "$b" } cheng() { local c=$[$1*$2] echo "$c" } chu() { local d=$[$1/$2] echo "$d" } [root@localhost function]# . funs [root@localhost function]# jia 1 2 3 [root@localhost function]# jian 3 1 2 [root@localhost function]# cheng 3 5 15 [root@localhost function]# chu 9 3 3
寫一個服務腳本/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為當前腳本名
[root@localhost sh.log]# cat testsrv.sh #!/bin/bash #author:DYW #(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為當前腳本名 name=$(basename $0) file=/var/lock/subsys/$name kaiqi() { if [ -e $file ];then echo "$name is aleady running" else touch $file [ $? -eq 0 ]&&echo "starting $name finished" fi } tingzhi () { if [ -e $file ];then rm -f $file&&echo "stop $name ok" else echo "$name is stopped yet" fi } chakan () { if [ -e $file ];then echo "$name is running" else echo "$name is stopped" fi } usage () { echo "Usage:$name {kaiqi|tingzhi|chakan|chongqi}" } if [ $# -lt 1 ];then usage exit fi case $1 in kaiqi) kaiqi ;; tingzhi) tingzhi ;; chongqi) tingzhi kaiqi ;; chakan) chakan ;; *) usage ;; esac [root@localhost sh.log]# bash testsrv.sh chakan testsrv.sh is stopped [root@localhost sh.log]# bash testsrv.sh kaiqi starting testsrv.sh finished [root@localhost sh.log]# ll /var/lock/subsys/ total 0 -rw-r--r--. 1 root root 0 Aug 24 2016 network -rw-r--r--. 1 root root 0 Aug 24 14:40 testsrv.sh [root@localhost sh.log]# bash testsrv.sh tingzhi stop testsrv.sh ok [root@localhost sh.log]# bash testsrv.sh chakan testsrv.sh is stopped [root@localhost sh.log]# bash testsrv.sh chongqi testsrv.sh is stopped yet starting testsrv.sh finished [root@localhost sh.log]# bash testsrv.sh chakan testsrv.sh is running [root@localhost sh.log]# bash testsrv.sh tingzhi stop testsrv.sh ok [root@localhost sh.log]# ll /var/lock/subsys/ total 0 -rw-r--r--. 1 root root 0 Aug 24 2016 network
編寫一個腳本/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退出
[root@localhost sh.log]# cat copycmd.sh #!/bin/bash #author:DYW #(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退出 ch_root="/wang/sysroot" [ ! -d $ch_root ]&& mkdir $ch_root #copy二進制程序 bincopy() { if which $1 &> /dev/null;then local cmd_path=`which --skip-alias $1` local bin_dir=`dirname $cmd_path` [ -d ${ch_root}${bin_dir} ]||mkdir -p ${ch_root}${bin_dir} [ -f ${ch_root}${cmd_path} ]||cp ${cmd_path} ${ch_root}${bin_dir} return 0 else echo "command not found" return 1 fi } #copy庫文件 libcopy() { local lib_list=$(ldd `which --skip-alias $1`|grep -Eo '/[^[:space:]]+') for loop in $lib_list;do local lib_dir=`dirname $loop` [ -d ${ch_root}${lib_dir} ]||mkdir -p ${ch_root}${lib_dir} [ -f ${ch_root}${loop} ]||cp $loop ${ch_root}${lib_dir} done } read -p "please input a command:" command while [ "$command" != "quit" ];do if bincopy $command;then libcopy $command fi read -p "please input a command:" command done [root@localhost sh.log]# bash copycmd.sh please input a command:cat please input a command:ls please input a command:pwd please input a command:hostname please input a command:quit [root@localhost sh.log]# cd /wang/sysroot/ [root@localhost sysroot]# ll total 4 drwxr-xr-x. 2 root root 4096 Aug 24 22:09 lib64 drwxr-xr-x. 3 root root 16 Aug 24 22:00 usr [root@localhost sysroot]# ll usr/bin/ total 224 -rwxr-xr-x. 1 root root 54048 Aug 24 22:08 cat -rwxr-xr-x. 1 root root 15768 Aug 24 22:09 hostname -rwxr-xr-x. 1 root root 117616 Aug 24 22:08 ls -rwxr-xr-x. 1 root root 33200 Aug 24 22:09 pwd
斐波那契數列又稱黃金分割數列,因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列: 0、 1、 1、 2、 3、 5、 8、 13、 21、 34、 ……,斐波納契數列以如下被以遞歸的方法定義: F( 0) =0, F( 1) =1, F( n) =F(n-1)+F(n-2)( n≥2)寫一個函數,求n階斐波那契數列
fact() { if [ $1 -eq 0 ];then echo 0 elif [ $1 -eq 1 ];then echo 1 else echo $[`fact $[$1-1]`+`fact $[$1-2]`] fi } [root@localhost function]# . funs [root@localhost function]# fact 10 55 [root@localhost function]# fact 3 2 [root@localhost function]# fact 4 3
漢諾塔(又稱河內塔)問題是源于印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。利用函數,實現N片盤的漢諾塔的移動步驟
[root@localhost sh.log]# cat hannuota.sh #!/bin/bash #author:DYW s=1 hnt() { if [ $1 -eq 1 ];then echo -e "第$s步:$1 $2 --> $4\n" ((s++)) else hnt $[$1-1] $2 $4 $3 echo -e "第$s步:$1 $2 --> $4\n" ((s++)) hnt $[$1-1] $3 $2 $4 fi } read -p "please input a number:" num hnt $num A B C [root@localhost sh.log]# bash hannuota.sh please input a number:3 第1步:1 A --> C 第2步:2 A --> B 第3步:1 C --> B 第4步:3 A --> C 第5步:1 B --> A 第6步:2 B --> C 第7步:1 A --> C
原創文章,作者:DYW,如若轉載,請注明出處:http://www.www58058.com/38580