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

相关推荐

  • Python内置数据结构

    Python内置数据结构 数值型 Int,float,complex,bool 序列对象 字符串:str  列表:list   数组:tuple 键值对 集合:set    字典:dict 数值型 Int,float,complex,bool都是class,1,5.0,2+3j都是对象即示例 Int:python3的int就是长整形,且没有大小限制,受限于内…

    Linux干货 2018-03-26
  • Shell脚本基础练习

    脚本编程能力是作为运维工程师不可或缺的一项基本技能,各种系统的运维,如果完全靠命令行一条一条命令来执行,工作效率可想而知,而脚本却可以将完成一定功能的各个命令依据一定的流程控制,逻辑判断去完成某种功能,提升工作效率。学习shell脚本,光学习理论是远远不够的,所以在学习中要多多练习,下面就看一些关于shell脚本基础的练习 (1) 编写脚本/root/bin…

    2017-08-05
  • RPM软件包管理

    Linux应用程序的组成 安装完一个软件包以后,可能会向系统中复制大量的数据文件,并进行相关设置。在Linux系统中,典型的应用程序通常由以下几部分组成。 普通的可执行程序文件:一般保存在“/usr/bin”目录中,普通用户即可执行。 服务器程序、管理程序文件:一般保存在”/usr/sbin“目录中,只有管理员能执行。 配置文件:一般保存在”/etc“目录中…

    Linux干货 2016-08-21
  • 27期第一周学习小结

    第一周 1. 描述计算机的组成及其功能。 计算机主要组成部分以下五种:运算器,控制器,存储器,输入设备,输出设备。 运算器的功能是对数据进行算术运算与逻辑运算,就是对数据进行加工处理。 控制器的功能是调度二进制程序,数据,内存寻址,以及协调计算机输入设备和输出设备等各计算机部件之间的正常工作。 存储器的功能是存储二进制指令和数据。存储器是编址存储单元。 输入…

    Linux干货 2017-07-15
  • shell脚本基础

    shell脚本基础 变量 bash的变量:  环境变量  本地变量  位置变量  特殊变量 本地变量:bash:作用域为整个bash进程 局部变量:作用域为当前代码段 local VARNAME=VALUE 引用变量:${VARNAME} 环境变量:作用域为当前的shell进程及其子进程 export VARNAME=…

    Linux干货 2017-04-16
  • 【招聘福利】普景/上海/运维工程师/8K起/双休/五险一金

    岗位要求:  经验可无,要求熟悉LANMP、zabbix的配置和维护  了解SQL语句  熟悉shell、会python 更佳岗位职责:  1. 负责zabbix的配置和维护,发现问题及时处理(如果你是有经验的童鞋,找出或者写出如Centreon类的软件优化邮…

    Linux干货 2016-04-15