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 21:28
下一篇 2016-08-25 10:09

相關推薦

  • bash腳本編程之流程控制if、for、while、until簡介

    概述     之前介紹了一些bash腳本編程的變量、運算、條件測試的一些基礎內容,了解了腳本實際上就是一些語句加上一些流程控制組合起來,實現某種功能的可執行文件。我們知道,條件測試的目的,實際就是為了實現一種流程的控制,那么本篇就簡單介紹一下bash里面常見的流程控制語句,包括選擇、循環等內容,具體包括以下幾個部分: …

    Linux干貨 2016-08-18
  • ?CentOS安裝程序{ 源碼包安裝;rpm包安裝;}&&恢復rpm功能

    ?CentOS安裝程序{ 源碼包安裝;rpm包安裝;}&&恢復rpm功能 本文是繼上一篇文章“CentOS程序安裝的3種方式{ 源碼包安裝 | rpm包安裝 | yum安裝;}”的補充,上篇文章http://www.www58058.com/38812主要介紹了yum安裝軟件的方法以及歸納了詳細的yum命令。本文繼續介紹基于本地file、遠程…

    Linux干貨 2016-08-24
  • 數組

    一.數組 變量:存儲單個元素的內存空間 數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。 索引:編號從0 開始,屬于數值索引  注:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,bash4.0 版本之后開始支持,bash 的數組支持稀疏格式(索引不連續) 二.數組的聲明 declare -a ARRAY_NAME decla…

    Linux干貨 2016-11-23
  • 啊 逗比呀!

    提示符,nano編輯,rz | sz命令,Sublime

    2017-11-19
  • N24期第四周作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 2、編輯/etc/group文件,添加組hadoop。 vim /etc/group,增加此行 3、手動編輯/etc/passwd文件新增一行,添加用戶hadoop,其基本組ID為hadoop組的id號;其家目錄為/home…

    Linux干貨 2016-11-22
  • 文本處理工具之grep

                    文本處理工具之grep 一、grep的簡介 1、grep是一個文本過濾器的工具,它根據用戶指定的模式(pattern)對目標文本進行匹配檢查,并將匹配的行打印到標準輸出或輸出重定向。 2、模式:由文本字符或正則表達式組成 3、正則表達式分…

    2017-05-06
欧美性久久久久