shll函數作業

掃描/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

(0)
DYWDYW
上一篇 2016-08-24
下一篇 2016-08-25

相關推薦

  • 中文man安裝手冊

      首先需要確認的是有沒有安裝中文支持,如果沒有請安裝:#yum groupinstall -y "Chinese Support" 現在下載安裝包: wget http://manpages-zh.googlecode.com/files/manpages-zh-1.5.1.tar.gz  (這個wget是直接網頁下…

    系統運維 2016-01-13
  • linux文件系統(ext2\ext3\ext4,xfs,btrfs…)的介紹[轉載]

    ext2\ext3\ext4,xfs,btrfs 都是針對服務器系統越來越高效實用的日志文件系統 日志文件系統:    日志文件系統是一種即使在斷電或者是操作系統崩潰的情況下保證文件系統一致性的途徑。XFS對文件系統元數據提供了日志支持。當文件系統更新時,元數據會在實際的磁盤塊被更新之前順序寫入日志。XFS的日志被保存在磁盤塊的…

    Linux干貨 2017-01-31
  • cobbler實現centos7和centos6的無人值守安裝

    環境:系統: CentOS 7.2  ip: 172.16.0.11 一. Cobbler安裝準備 Cobbler是一個Linux服務器安裝的服務,可以通過網絡啟動(PXE)的方式來快速安裝、重裝物理服務器和虛擬機,同時還可以管理DHCP,DNS等。 Cobbler可以使用命令行方式管理,也提供了基于Web的界面管理工具(cobbler-web),…

    Linux干貨 2017-06-04
  • N21_第四周

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 # cp -a /etc/skel/ /home/user1/ && chmod -R 7000 /home/user…

    Linux干貨 2016-08-02
  • 常用RAID級別淺析

    簡介:    RAID為獨立冗余磁盤陣列的簡稱,它可以通過軟件或硬件技術把多個較小的磁盤整合成一個較大的磁盤。從而實現較大的 磁盤存儲,容錯及數據保護功能,較快的數據讀寫等功能. 實現方式:      硬件實現方式:通過bios參數調整來實現      軟件實…

    2017-06-17
  • N26-第四周作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 [root@localhost ~]# cp -rfp /etc/skel/ /home/tuser1[root@localhost ~]# chmod 700 /home/tuser1 2、編輯/etc/group文件,添…

    Linux干貨 2017-02-25
欧美性久久久久