java里的shell类是什么(什么是shell窗口。Java基础书中一直说打开一个shell窗口)
这篇文章给大家聊聊关于java里的shell类是什么,以及什么是shell窗口。Java基础书中一直说打开一个shell窗口对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
linux中的shell是什么意思
ll程序呢?简单的说shell程序就是一个包含若干行
shell或者linux命令的文件.
象编写高级语言的程序一样,编写一个shell程序需要一个文本编辑器.如VI等.
在文本编辑环境下,依据shell的语法规则,输入一些shell/linux命令行,形成一个完整
的程序文件.
执行shell程序文件有三种方法
(1)#chmod+x file(在/etc/profile中,加入export PATH=$:~/yourpath,就可以在命令行下直接运行,像执行普通命令一样)
(2)#sh file
(3)#. file
(4)#source file
在编写shell时,第一行一定要指明系统需要那种shell解释你的shell程序,如:#!/bin/bash,
#!/bin/csh,/bin/tcsh,还是#!/bin/pdksh.
2.shell中的变量
(1)常用系统变量
$#:保存程序命令行参数的数目
$?:保存前一个命令的返回码
$ 0:保存程序名
$*:以("$1$2...")的形式保存所有输入的命令行参数
$@:以("$1""$2"...)的形式保存所有输入的命令行参数
(2)定义变量
shell语言是非类型的解释型语言,不象用C++/JAVA语言编程时需要事先声明变量.给一
个变量赋值,实际上就是定义了变量.
在linux支持的所有shell中,都可以用赋值符号(=)为变量赋值.
如:
abc=9(bash/pdksh不能在等号两侧留下空格)
set abc= 9(tcsh/csh)
由于shell程序的变量是无类型的,所以用户可以使用同一个变量时而存放字符时而存放
整数.
如:
name=abc(bash/pdksh)
set name= abc(tcsh)
在变量赋值之后,只需在变量前面加一个$去引用.
如:
echo$abc
(3)位置变量
当运行一个支持多个命令行参数的shell程序时,这些变量的值将分别存放在位置变量里.
其中第一个参数存放在位置变量1,第二个参数存放在位置变量2,依次类推...,shell保留
这些变量,不允许用户以令外的方式定义他们.同别的变量,用$符号引用他们.
3.shell中引号的使用方法
shell使用引号(单引号/双引号)和反斜线("\")用于向shell解释器屏蔽一些特殊字符.
反引号(")对shell则有特殊意义.
如:
abc="how are you"(bash/pdksh)
set abc="how are you"(tcsh)
这个命令行把三个单词组成的字符串how are you作为一个整体赋值给变量abc.
abc1='@LOGNAME,how are you!'(bash/pdksh)
set abc1='$LOGNAME,how are you!'(tcsh)
abc2="$LOGNAME,how are you!"(bash/pdksh)
set abc2="$LOGNAME,how are you!"(tcsh)
LOGNAME变量是保存当前用户名的shell变量,假设他的当前值是:wang.执行完两条命令后,
abc1的内容是:$LOGNAME, how are you!.而abc2的内容是;wang, how are you!.
象单引号一样,反斜线也能屏蔽所有特殊字符.但是他一次只能屏蔽一个字符.而不能屏蔽
一组字符.
反引号的功能不同于以上的三种符号.他不具有屏蔽特殊字符的功能.但是可以通过他将
一个命令的运行结果传递给另外一个命令.
如:
contents=`ls`(bash/pdksh)
set contents= `ls`(tcsh)
4.shell程序中的test命令
在bash/pdksh中,命令test用于计算一个条件表达式的值.他们经常在条件语句和循环
语句中被用来判断某些条件是否满足.
test命令的语法格式:
test expression
或者
[expression]
在test命令中,可以使用很多shell的内部操作符.这些操作符介绍如下:
(1)字符串操作符用于计算字符串表达式
test命令|含义
-----------------------------------------
Str1= str2|当str1与str2相同时,返回True
Str1!= str2|当str1与str2不同时,返回True
Str|当str不是空字符时,返回True
-n str|当str的长度大于0时,返回True
-z str|当str的长度是0时,返回True
-----------------------------------------
(2)整数操作符具有和字符操作符类似的功能.只是他们的操作是针对整数
test表达式|含义
---------------------------------------------
Int1-eq int2|当int1等于int2时,返回True
Int1-ge int2|当int1大于/等于int2时,返回True
Int1-le int2|当int1小于/等于int2时,返回True
Int1-gt int2|当int1大于int2时,返回True
Int1-ne int2|当int1不等于int2时,返回True
-----------------------------------------
(3)用于文件操作的操作符,他们能检查:文件是否存在,文件类型等
test表达式|含义
------------------------------------------------
-d file|当file是一个目录时,返回 True
-f file|当file是一个普通文件时,返回 True
-r file|当file是一个刻读文件时,返回 True
-s file|当file文件长度大于0时,返回 True
-w file|当file是一个可写文件时,返回 True
-x file|当file是一个可执行文件时,返回 True
------------------------------------------------
(4)shell的逻辑操作符用于修饰/连接包含整数,字符串,文件操作符的表达式
test表达式|含义
----------------------------------------------------------
! expr|当expr的值是False时,返回True
Expr1-a expr2|当expr1,expr2值同为True时,返回True
Expr1-o expr2|当expr1,expr2的值至少有一个为True时,返回True
-----------------------------------------------------------
注意:
tcsh shell不使用test命令,但是tcsh中的表达式同样能承担相同的功能.tcsh
支持的表达式于C中的表达式相同.通常使用在if和while命令中.
tcsh表达式|含义
-------------------------------------------------------
Int1<= int2|当int1小于/等于int2时,返回True
Int1>= int2|当int1大于/等于int2时,返回True
Int1< int2|当int1小于int2时,返回True
Int1> int2|当int1大于int2时,返回True
Str1== str2|当str1与str2相同时,返回True
Str1!= str2|当str1与str2不同时,返回True
-r file|当file是一个可读文件时,返回True
-w file|当file是一个可写文件时,返回True
-x file|当file是一个可执行文件时,返回True
-e file|当file存在时,返回True
-o file|当file文件的所有者是当前用户时,返回True
-z file|当file长度为0时,返回True
-f file|当file是一个普通文件时,返回True
-d file|当file是一个目录时,返回True
Exp1|| exp2|当exp1和exp2的值至少一个为True时,返回True
Exp1&& exp2|当exp1和exp2的值同为True时,返回True
! exp|当exp的值为False时,返回True
什么是shell窗口。Java基础书中一直说打开一个shell窗口
shell窗口是指命令行窗口,传统意义上的shell指的是命令行式的shell。
1.Windows下shell窗口
2.Linux的shell窗口为terminal窗口。
shell是指“提供使用者使用界面”的软件(命令解析器)。类似于DOS下的command。shell接收用户命令,然后调用相应的应用程序。同时shell又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。
beanshell和shell的区别
BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
BeanShell是一种松散类型的脚本语言(这点和JS类似)
BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,
具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
官网:http://www.BeanShell.org/
BeanShell将成为Java平台上的第三种编程语言,前两种分别为java和Groovy(也是一种脚本语言)
下载与安装:
jar: http://www.beanshell.org/download.html
src: http://www.beanshell.org/developer.html
或使用SVN:
svn co http://ikayzo.org/svn/beanshell
doc: http://www.beanshell.org/docs.html
设置环境:
(1)把bsh-xx.jar放到$JAVA_HOME/jre/lib/ext文件夹下(不推荐);
(2) UNIX: export CLASSPATH=$CLASSPATH:bsh-xx.jar(推荐)
(3) WINDOWS: set classpath%classpath%;bsh-xx.jar(推荐)
运行方式:
(1)界面UI方式: java bsh.Console
(2)命令行方式: java bsh.Interpreter
(3)运行脚本文件: java bsh.Interpreter filename [args]
简单举例(windows):
设置好环境变量classpath,打开dos或CMD窗口,键入命令:
java bsh.Console
出现BeanShell的"Bsh Workspace"界面,表示设置成功,BeanShell开始运行;
在使用上面命令出现的控制台界面中进行下面的测试:
bsh% foo="Foo";//定义变量foo
bsh% four=(2+2)*2/2;//定义变量four并初始化为(2+2)*2/2
bsh% print(foo+"="+four);//输出 Foo=4
Foo=4//输出结果
bsh% for(i=0;i<5;i++)print(i);//循环打印0~4
0
1
2
3
4
bsh% button= new JButton("MyButton");//实例化一个Button对象
bsh% frame= new JFrame("MyFrame");//实例化一个Frame对象
bsh% frame.getContentPane().add(button,"Center");//将Button对象加入Frame对象的面板中;
bsh% frame.pack();//打包
bsh% frame.setVisible(true);//设置Frame对象的可见性;回车后会弹出一个GUI界面;
bsh%
完整代码:
foo="Foo";
four=(2+ 2)*2/2;
print( foo+"="+ four);
for(i=0; i<5; i++)
print(i);
button= new JButton("My Button");
frame= new JFrame("My Frame");
frame.getContentPane().add( button,"Center");
frame.pack();
frame.setVisible(true);
在窗口中输入上面的代码,敲回车执行,弹出一个有Button的GUI界面.
说明:
因为BeanShell是松散类型的脚本语言因此可以直接写:
foo="Foo";
four=(2+ 2)*2/2;
也就是foo与four均不需要变量类型的声明,给赋什么类型的值,就是什么类型的变量;
print()是BeanShell提供一种简单的打印命令,相当于java中的System.out.println();
脚本中所写的方法范例:
int addTwoNumbers( int a, int b){
return a+ b;
}
sum= addTwoNumbers( 5, 7);// 12
也可以使用动态的变量类型(无状态)方法
add(a, b){
return a+ b;
}
foo= add(1, 2);// 3
foo= add(1,"2");//"12"
特别注意:
只要有一个为字符串全部按照字符串处理,
系统不会根据1是数字在前把"2"转换成数字处理;
foo= add("Oh"," baby");//"Oh baby"
脚本中实现接口:
实现任何接口需要JDK1.3或者更高,可以使用缺省的java匿名类的语法实现一个接口类,例如:
ActionListener scriptedListener= new ActionListener(){
actionPerformed( event){...}
}
不需要实现接口的所有的方法,只需要实现你使用的方法即可,如果使用你没有实现的方法,
BeanShell将抛出一个错误,如:
ml= new MouseListener(){
mousePressed( event){ print("test");}
// handle the rest
invoke( name, args){
print("Method:"+name+" invoked!");
}
}
脚本中定义对象:
例一:
使用特殊的关键字this可以创建一个对象(根JS类似)
foo(){
print("foo");
x=5;
bar(){
print("bar");
}
return this;
}
myfoo= foo();// prints"foo"
print( myfoo.x);// prints"5"
myfoo.bar();// prints"bar"
例二:
在java标准语言中可以使用this返回一个类的一个实例
// MyClass.java
MyClass{
Object getObject(){
return this;// return a reference to our object
}
}
在这个例子中getObject()方法是返回MyClass类的一个实例
在BeanShell中对象中的变量只是局部的变量在对象内可以使用,
在对象外是不可以使用的(不同于前面for-loop,if-else中的使用);
// Define the foo() method:
foo(){
bar= 42;
print( bar);
}
// Invoke the foo() method:
foo();// prints 42
print(bar);// Error, bar is undefined here
这里的print(bar);会抛出异常:
// Error: EvalError: Undefined argument: bar: at Line: 1: in file:<unknown file>:( bar)
但可以使用this返回对象,使用对象加上"."运算符引用属性(类似JS)
foo(){
bar= 42;
return this;
}
fooObj= foo();
print( fooObj.bar);// prints 42
同样对象中也可以定义一些方法,例如:
foo(){
int a= 42;
bar(){
print("The bar is open!");
}
//bar();
return this;
}
// Construct the foo object
fooObj= foo();// prints"the bar is open!"
// Print a variable of the foo object
print( fooObj.a)// 42
// Invoke a method on the foo object
fooObj.bar();// prints"the bar is open!"
也可以定义bar()和foo()也带参数:
foo(){
bar(int a){
print("The bar is open!"+ a);
}
return this;
}
foo().bar(1);
也可以把bar()方法定义到对象外面
foo(){
return this;
}
bar(int a){
print("The bar is open!"+ a);
}
foo().bar(1);//其实就是bar(1);
BeanShell一种松散的脚本语言,有很多中声明的方法可以使用:
This super global
This是引用当前对象
Super是引用父亲对象
Global是引用最上层对象
super.super.super...foo= 42;// Chain super. to reach the top
global.foo= 42;
BeanShell(Bsh)调用外部Java类的两种方式:
(1)方法一(直接调用.java源文件)
sourceRelative("xxx.java");
利用sourceRelative()方法把java的源代码引入bsh环境中,然后进行调用。
这种方法不需要编译引用的java源文件,缺点也很明显"无法利用javac来检查java代码"。
(2)方法二(通过引用.class二进制文件)
import xxx;
利用传统的java import机制来获取java类,然后在bsh环境中进行调用。
需要编译.java文件;
方便调用第三方的Java API(因为通常情况下无法得到API的源码,即使得到了文件会远大于jar包的大小)。
BeanShell介绍:
我们知道,现在有很多脚本语言,大家平时使用的比较多的包括Perl,Python,Ruby,JavaScript,Groovy,
在这里我要介绍的是另外一个对象脚本语言BeanShell(http://www.BeanShell.org)。
BeanShell的解释器是用Java写的,开源并且免费的,
引用open-open上面的话来说明它的运作方式:
它将脚本化对象看作简单闭包方法(simple method closure)来支持,
就如同在Perl和JavaScript中的一样。它具有以下的一些特点:
*使用Java反射API以提供Java语句和表达式的实时解释执行;
*可以透明地访问任何Java对象和API;
*可以在命令行模式、控制台模式、小程序模式和远程线程服务器模式等四种模式下面运行;
*与在应用程序中一样,可以在小程序中(Applet)正常运行(无需编译器或者类装载器);
*非常精简的解释器, jar文件中的Intepreter.class大小为150+k"。
每一种脚本语言都有它的使用场景,而正是因为其在某些场景的使用而使语言本身得到了发扬光大,
比如Ruby正是因为Ruby On Rails这个Web框架的流行而得到开发者的关注,Groovy也一样;
BeanShell可不能再有Web框架,Java世界的Web框架已经太多了,够让人头痛的了;
BeanShell是Java语法,所以对Java开发者来说,很快就可以上手,
BeanShell不能像Ruby,Perl,Ruby一样可以占据一个系统的主体,
而只能在一些小的地方发挥"螺丝钉"的作用。
笔者与BeanShell结缘是通过一个开源工作流引擎-OBE(这个鸟东西现在好像没什么声音了),
BeanShell被用作流程跳转的Parser,举个例子,比如一个流程A节点的下一个节点是B或者C,
如何决定A->B还是A->C呢,我们可以写一段Java脚本放在流程定义里面,
一旦A运行完毕,流程会使用BeanShell来Parse这段Java脚本,
根据脚本的返回值决定流程下一步的运行方向,
脚本在这里虽然用得不多,但是却是非常的重要,
我们知道,简单的表达式是远远满足不了流程跳转的判断的,
有了脚本就可以满足任何不规则的业务逻辑。
继以上说到的,使用BeanShell可以处理现实中不规则的业务,举个很典型的例子,
我们知道,一个保险公司有很多险种,每个险种的投入和收益的算法是很复杂的,
无法用规则的关系数据库模型来描述,所以很多保险系统在处理险种的算法都是硬编码,
如果要在系统中新加一个险种,是非常麻烦的,重新修改代码,重新发布,
这对开发\维护人员和客户都是很痛苦的,有了BeanShell,我们可以从这种痛苦中解脱出来,
对每个险种使用不同的脚本,新加的险种我们新配一个脚本,这样既可以满足业务多变的要求,
又可以减少工作量,节约成本。
BeanShell的一个特点是动态执行Java代码,脚本文件改变不会影响当前脚本的调用,
新脚本将在脚本的下一次调用生效,这不同于配置文件,配置文件改变一般都需要应用重启。
下面举个例子来说明BeanShell的使用(JDK1.5,BeanShell2.04),
主类:
package com.test.BeanShell;
import bsh.Interpreter;
public class TestShell{
public static void main(String[] args) throws Exception{
Interpreter interpreter= new Interpreter();
interpreter.set("inValue", new Integer(1));
interpreter.source("/D://BeanShell_test/test.bsh");
System.out.println(((Integer) interpreter.get("outValue")).intValue());
}
}
脚本文件(D:/BeanShell_test/test.bsh)中的内容为::
System.out.println("hello,in value is"+inValue);
outValue= inValue+1;
结果:
hello,in value is 1
2
再来一个简单例子:
(1)下载BeanShell的jar,加到 classpath里
(2)写一个脚本文件 myscript.txt,内容如下:
a= 2;
b= 3;
c= a+ b;
print(c);
(3)运行该脚本
d:\BeanShell>java bsh.Interpreter myscript.txt
如果没有将BeanShell的JAR加到classpath路径里,运行下面的命令:
java-classpath%CLASSPATH%;bsh-2.0b4.jar bsh.Interpreter myscript.txt
OK,输出结果5
写一个bat文件 bsh.bat放到系统目录下,如:winnt文件内容如下:
java bsh.Interpreter%1
就可以使用如下方法运行脚本文件了
c:\BeanShell>bsh myscript.txt
osworkflow用的就是他了
和Eclipse的集成: http://eclipse-shell.sourceforge.net/index.html
eclipse update url: http://eclipse-shell.sourceforge.net/update/
有用的BeanShell命令:
在刚才那个例子中我们用了一个内建在BeanShell中的一个方便的命令print(),来显示变量的值。
print()跟Java的System.out.println()非常的相像,除非它能保证输出总是命令行。
print()也可以显示一些对象的类型(如数组),但比Java的更详细。
另一个相关的命令是show(),用来开启与关闭显示你输入的每一行的结果。
好了,文章到这里就结束啦,如果本次分享的java里的shell类是什么和什么是shell窗口。Java基础书中一直说打开一个shell窗口问题对您有所帮助,还望关注下本站哦!