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

相关推荐

  • RAID(重要)

    RAID   RAID(Redundent Array of Independent Disk):独立的冗余磁盘阵列,目的是为了结合多个物理驱动器组成单个单元,提高了磁盘的性能或保证数据冗余。RAID能够防止硬件的故障导致数据丢失,但是不能防止人为操作,软件故障、恶意软件感染等造成的数据丢失,因此不能替代备份。 分类有:硬件实现RAID(一是外接式磁盘阵列柜…

    Linux干货 2016-08-30
  • Linux 基础以及相关基础命令

    1.计算机的组成 计算机由5大部分组成,cpu(运算器,控制器)输入单元,输出单元,内存。  运算器:负责数据的运算  控制器:负责各主件之间的协调控制  输入单元:指令的输入  输出单元:计算结果的输出  内存:为cpu需要运算的数据提供存储 2 linux 常见的发行版   Debian :ub…

    Linux干货 2016-09-14
  • 文本处理:三剑客之sed及vim编辑器

    一、sed的用法详解 sed作为Linux的第二招,有着非常强大的文本处理功能。sed是一种在线编辑器、行编辑器,每次处理一行内容。在处理时,sed首先将行放在内存中的一块临时缓冲区,通常配叫做模式空间(pattern space)。如果模式空间的行符合sed的匹配模式则将该行处理后送到标准输出,如果不匹配则不做任何改动送到标准输出。模式空间中一般情况下只会…

    Linux干货 2016-08-12
  • Linux基础 & bash相关

    Q1:Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 文件管理类命令: cd, ls, touch, cp, mv, rm, cat, tac, more, less, tail, head; 详细介绍以上命令: cd: 在Linux文件系统上,可以使用切换目录命令cd将shell会话切换到另一个目录。 命令格式: ~]#&nbsp…

    Linux干货 2016-11-06
  • N22-第一周练习作业-冥界之王

    1.描述计算机系统的组成及功能硬件组成(输入设备,输出设备,存储器,运算器,控制器) 输入设备:鼠标,键盘,麦克,声卡(输入声音),扫描仪,手写板等输出设备:显示器,声卡(输出声音),音箱,投影仪等存储器:内存,硬盘,磁带,CPU内部还可以分1,2,3级缓存运算器:主要完成对二进制数据的定点算术运算(加减乘除)、逻辑运算(与或非异或)以及移位操作。在某些CP…

    Linux干货 2016-08-15
  • LVS-dr模型

    网络拓扑图 需三台主机 要在主机rs上做系统内核的限制 vs主机上配置vip和在rs主机上在lo环配置vip 那个先开始都行 rs主机上在lo环配置vip必须要晚于于在rs主机做内核的限制 在VS主机上配置VIP #ifconfig ens33:0 172.18.0.33 network 255.255.255.2550 broadcast 172.18.0…

    Linux干货 2017-05-17