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.178linux.com/38580

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

相关推荐

  • Linux文件和目录管理

    Linux目录和文件管理 Linux文件信息详述 文件数据存储在块中 文件元数据存储在inode中 文件名和其对应的inode号码存储在目录项中 数据块的概念: 文件在硬盘上的最小存储单位叫做扇区,1扇区=512字节,操作系统读取硬盘的时候不会一个一个读,这样太慢,会一次连续读多个扇区,即一个读取一个“块”,常见的 1块=八个扇区=4kB inode的概念:…

    Linux干货 2016-11-04
  • WEB 常见故障与处理

    一、应用故障 HTTP 502 故障 502 Bad Gateway 故障检测: 首先定位到前端故障服务器节点,在前端服务器(Telnet)上访问后端服务端口响应时间。如发现响应时间超时>10s。说明后端应用程序出现故障。需要到后端服务器查看,并查明情况。 PS:HTTP 502 Bad Gateway 故障一般分为以下2种情况: 网络问题:前端无法连…

    2016-06-03
  • sed文本处理工具

    Sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转…

    Linux干货 2017-12-02
  • Linux LVM介绍及管理

    什么是LVM? LVM是逻辑盘卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,用来提高磁盘分区管理的灵活性。系统管理员可以通过LVM轻松的管理磁盘分区,如:将若干个磁盘分区或物理磁盘连接为一个整块的卷组 (volumegroup),形成一个存储池。管理员可以…

    Linux干货 2016-08-30
  • 第一周作业

    一:计算机的组成和功能 主要分为五个部分:控制器、运算器、存储器、输入、输出 CPU :包含控制器和运算器、寄存器、缓存 存储器:内存,RAM(Random Access Memory) 输入:下指令,提供数据等 输出:输出数据加工的结果     微型计算机系统组成:      …

    Linux干货 2016-12-06
  • Oracle 11G 安装图解

    Oracle 11G 安装图解 wmd-preview h1 { color: #0077bb; /* 将标题改为蓝色 */ } Oracle 11G 安装图解 oracle Oracle 介绍   Oracle Database,又名Oracle RDBMS,或简称Oracle 是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。…

    2017-04-24