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

