yunshichen

我相信人生是值得活的,尽管人在一生中必须遭受痛苦,卑劣,残酷,不幸和死亡的折磨,我依然深信如此.但我认为人生不一定要有意义,只是对一些人而言,他们可以使人生有意义. ---J 赫胥黎

Ubuntu 游戏安装设置总篇


安装超任模拟器 Snes9X GTK

我对SFC有很深的感情. 试想在90年代, 一盘任天堂卡带动辄200-300银子, 而刷一张超任磁碟最多3块钱. 换个4碟的游戏三国志4才最多12块钱. 多么节省银子啊.

感谢这个软件的作者, 向其致以崇高的敬意. 让我得以在Ubuntu重温超任旧梦.

官方主页: https://launchpad.net/~bearoso/+archive/ppa

E文不好的同学请看我的翻译:

首先,打开源配置文件

sudo gedit /etc/apt/source.list

根据你的Ubuntu版本号, 追加以下源到文件里. 注意, 我是Ubuntu904, 如果你装的是804/810/910, 请自行将jaunty 换成 hardy 等字样

deb http://ppa.launchpad.net/bearoso/ppa/ubuntujaunty main 
deb-src http://ppa.launchpad.net/bearoso/ppa/ubuntujaunty main

保存并关闭文件. 运行如下命令

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6CF5CE97
sudo apt-get update
sudo apt-get install snes9x-gtk

这样安装就完成了.但需要注意的是, 默认将游戏的分辨率设成你电脑的分辨率. 这样你打开游戏会非常慢. 解决方法很简单, 依次打开 options -- preference 在左方的树形菜单找到 display , 在右方找到 change fullscreen resolution , 打上勾, 并将之设置为 1024 * 768, 保存即可.

这是我玩多拉基亚776的画面. 感谢游戏的翻译者和这个模拟器的开发者. 再次对你们表达我的敬意.(图暂时传不上)


安装PS模拟器 ePSXE 1.6

网上安装ePSXE的文章多数很老, 介绍在Ubuntu710 下装的. 今天翻出了一篇强文, 该文作者写了个一键式的安装脚本. 让我如获至宝. 下载后再经自己验证, 修改, 最终得出了这个完善了的安装程序. 应该能通行于Ubuntu 804/810/904/910

首先, 打开这个页面下载安装脚本:  http://www.uushare.com/filedownload?user=diegoyun&id=2586695

然后运行如下安装命令

sudo ./installepsxe-32bit-diego-version.sh

命令运行完毕之后, 你将会看到 ~/epsxe 文件夹.

为了玩PS,你需要一个bios文件. 限于版权, 我不能直接把这个文件放到网上. 请自行搜索 Scph1001.bin  和 Scph7502.bin 文件, 并将之放到 ~/epsxe/bios 文件夹.

现在, 运行 ~/epsxe 目录里的 epsxe, 你就可以打开模拟器玩游戏了.

显卡的设置

如果你发现打开游戏的速度很慢, 那么你的显卡大概像我的一样差. 这种情况下, 你可以使用peter's people soft 驱动. 这个驱动的显示效果较次, 但速度很快. 对于玩PS的人来说, 足够满足需求了.

先打开模拟器, 依次点击 config -- video , 在下拉列表里, 选择 P.E.Op.S. SoftX Driver 1.18

然后点 Configure , 设置很简单, 先点 Nice, 然后点 Window Mode . (这一步很重要. 如果你不点, 默认是全屏打开. 你会看不到游戏界面. ) 我目前设置的是1024 * 768, 再大点我的显卡就不行了. 你可以自己调整试试.

附注: 参考文章:  http://ubuntuforums.org/showthread.php?t=1376675  对作者致以崇高敬意.





posted @ 2010-02-14 15:20 Chenyunshi 阅读(647) | 评论 (0)编辑 收藏

软件软性技巧


问题记录格式


从老美那学到的格式,记录开发配置中所遇到的问题.例如当A遇到问题需要B解决时,就可以将之记录下来.这种格式的好处是:
  • 责任明确
  • 时间明确
  • 是否拖延,一目了然
  • 提醒自己和对方别浪费时间.

例如,请看看这个例子

问题编号
问题描述
提出者
提出时间建议谁来解决
状态
解决时间
实际解决者
解决办法
1
现在我们想达到的效果如下:
1)银行对账扫描的是系统真实的a表.
2)b公司记录扫描的是经筛选的b表.
但一个数据库不能有两个表同名.如何满足我们这个需求?

张三
2009/03/14李四
open



2
什么时候建好svn或cvs?
李四
2009/03/14
张三
closed
2009/03/15
张三
已经在192.168.1.1上建好svn服务器,连接地址为.....


当然,如果时间允许,可以装类似bug zilla或者jira之类issue tracking工具. 如果实在没时间,就用这个格式先对付着干.





posted @ 2009-12-25 23:48 Chenyunshi 阅读(307) | 评论 (2)编辑 收藏

Hibernate经验心得技巧



怎样取得hsql的返回值

取多个字段,Hibernate把每个id和name做成一个2个元素的单维数组,List实际上是一个单维数组的集合。

Query q = s.createQuery("select Cat.id, Cat.name, from Cat ");;
List l = q.list();;
for (int i=0;  i< l.size();; i++); {
  Object[] row = (Object[]); l.get(i);;
  Long id = (Long); row[0];
  String name = (String); row[1];  
}

在这种情况下,HQL是不会去构造PO的





get(find) 和 load的区别

http://blog.csdn.net/cin_ie/archive/2009/07/13/4345475.aspx
http://blog.csdn.net/kunmingkunlun/archive/2008/03/20/2198818.aspx

简单总结

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。


之所以记下这个主题, 是今天在arm里发现一个很骇人的查询性能问题. 某处程序出错, 原因是该对象的引用对象的父对象id不存在, 于是我随随便便写了个find语句去取出对象. 举例如下


A.getB.getC.getId


在hbm里, a引用了b,b引用了c. 但因为如果不用lazy的模式,hsql会立刻找出所有的对象关系树. 恰好这几个对象都大量引用了其他对象. 最后就这个小小的操作,居然执行了将近50条sql查询语句!


经验总结:

1) 在查询多表关联的时候,尽量用jdbc. 如果一时贪方便用hsql, 那么也要用query方法而不是直接find,load. 并且做好良好的dao接口. 这样在该方法出现性能问题时,可以在dao实现里修改而不影响业务逻辑.

2) 侧面证明了把sql/hsql放在dao层的重要性. 对很简单的sql, 放在service和dao的区别不大, 但如果预见到该方法查询的数据多, 可能出现性能问题, 那么尽量将之放到dao. 当然, 这和程序员的经验有关.




hibernate 2.1连ORACLE有错,需查看SQL,可是UPDATE或INSERT中的值都被替换成“?”,如何才能显示出完整的SQL呢?

  在WEB-INF/classes/log4j.properties添加如下内容:

  ### log just the SQL
  log4j.logger.net.sf.hibernate=info
  ### log just the SQL
  #log4j.logger.net.sf.hibernate.SQL=debug
  ### log JDBC bind parameters ###
  log4j.logger.net.sf.hibernate.type=debug

posted @ 2009-12-25 23:41 Chenyunshi 阅读(471) | 评论 (0)编辑 收藏

杂七杂八的软件技巧


Eclipse

不太喜欢Eclipse的鼠标悬停提示功能(主要是变量类型声明和Doc帮助提示),突然弹出的窗口妨碍视线还影响思路,关闭方法如下:
Window->Preferences->Java->Editor->Hovers 将[Combined Hover]取消即可


腾讯的图片验证码地址:
http://ptlogin2.qq.com/getimage?aid=15000101&

设置wsad启动内存
wsad , 到安装目录找到 wsappdev.ini
VMArgs=-Xj9 -Xmx1024M



昨天,我以为是机器运行时间太长,重启一下,果然好了。但是今天又来了。看了一下错误提示,我以为是JVM有问题,就在启动Eclipse里加个 JVM的参数,结果还是不行。

后 来在网上找了一下,有人说是JAVA环境配置的问题,我想这不可能,因为以前一直用的好好的。有人说是JVM的问题,这个我刚刚换了一个,也不是这个问 题,后来看来有人说是:eclipse.ini中内存设置过大的问题,虽然我不以为然,还是试了一下,以前我修改过内存设置,一直都好好的,之前 eclipse.ini的配置如下:

-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
512m
-vmargs
-Xms256m
-Xmx512m
-Duser.language=en
-XX:PermSize=256M
-XX:MaxPermSize=512M

现在修改了一下,-Xms256m改成-Xms128m, 把Xmx512m  改为 Xmx256m,结果还真的好了,没想到居然是这样的小问题引起来的。

posted @ 2009-12-25 23:40 Chenyunshi 阅读(312) | 评论 (0)编辑 收藏

数据库技巧总结


oracle : 插入单引号 . insert into org_region (reg_id,reg_nom,reg_description) values (111,'rest ''','test')


hibernate插入mysql中文乱码问题

找到my.ini, 修改默认的encoding为gb2312.  注意, 原有数据库要删除重建. 许多人就失败在这一步上.

oracle:合并多行字符串 : http://czjxdm.javaeye.com/blog/466948



tnsnames.ora
at path: \ora92\network\admin

service_name:
means database instance.

posted @ 2009-12-25 23:39 Chenyunshi 阅读(247) | 评论 (3)编辑 收藏

Java 技巧记录


Parser parser  =   new  Parser();
      
        parser.setURL(address);
       
        NodeFilter tableFilter 
=   new  NodeClassFilter(TableTag. class );
       
        NodeList list
= parser.extractAllNodesThatMatch(tableFilter);
       
        String test 
=   new  String(list.toHtml().getBytes( " iso8859-1 " ), " gb2312 " );
        System.out.println(test);

这是我写的一段抓网页的程序, 开始抓回来的数据在ie显示正常, 而在firefox为乱码. 在eclipse里打印也是乱码. 后来将字符串以iso8859-1 转到gb2312, 一切正常.

牢记: get和post方式发送请求, 默认就是iso8859-1. 只不过ie隐含的将之转换而已.

iso8859-1 我称为结果编码. gb2312称为显示编码. 怎么找这两个编码?

1>get和post默认都是iso8859-1, 所以结果编码一般为iso8859-1. 但如果是ajax请求, 则一般为utf-8. 所以可以在两者之间试试.
2>显示编码在该网页就能抄到.要不网页也不能正确显示中文.

也可以加上:

parser.setEncoding("gb2312");


省了手动转码的工夫.


//多行记录合并.

public List generateDataList(HttpServletRequest request) {
        List systemOwners 
= new ArrayList();
        List dataList 
= new ArrayList();
        
try {
            
            systemOwners 
= (List)Manager.GetInstanceSystemOwner(null);
            List entityList 
= getEntityList();
            List regionList 
= getRegionList();
            
            RoleActeur actor;
            Map result 
=null;
            String instanceId;
            String instanceLabel;            
            String scopeId;
            String scope;
            String scopeLabel;
            String key
=null;
            String lastKey
=null;
            String validatorStr
=null;
            String sep
=",";
            
for(Iterator it = systemOwners.iterator();it.hasNext();){
                actor 
= (RoleActeur)it.next();
                instanceId         
=     actor.getEntiteOrganisationnelle().toString();
                instanceLabel     
=     actor.getInstanceName();
                scopeId            
=    actor.getScopeId().toString();
                scope            
=    actor.getScope();
                scopeLabel         
=     getEntityOrRegionName(scope,scopeId,entityList,regionList);
                key 
= instanceId+"_"+scopeId+"_"+scopeLabel;
                
                
if(!key.equals(lastKey)){
                    
if(result!=null){
                        dataList.add(result);                                        
                    }
                    result 
= new HashMap();
                    result.put(
"IAP_ID",instanceId);
                    result.put(
"IAP_LIBELLE",instanceLabel);
                    result.put(
"SCOPE_ID",scopeId);
                    result.put(
"SCOPE_LABEL",scopeLabel);        
                    lastKey 
= key;
                }
                
                concateString(result,
"INSTANCE_IDS",actor.getIdActeur(),sep);                
            }
            
if(result!=null){
                
//Add the last one.
                dataList.add(result);                    
            }
            
        }
catch (Exception e) {
            logger.error(e);
        }
                
        
return dataList;
    }

曾经想过写个接口. 后来想想很难包含其他业务. 干脆先把代码记录下来.



posted @ 2009-12-25 23:38 Chenyunshi 阅读(237) | 评论 (0)编辑 收藏

JavaScript 技巧记录


iframe
使用iframe的时候, ie6 要在setting里设置浏览器为" 每次都去取新路径. " 要不浏览器就会在缓存取内容. 这样导致的结果就是, 假如iframe里有跳转, 那么只有第一次跳转是对的. 其他时候都显示第一次跳转的内容.



判断文档加载:(extjs 也是这么做的. 用一个interval函数来反复检查.)
document.onreadystatechange = function(){           if(document.readyState=="complete")           {           alert('加载完毕');         } }



当ajax遭遇系统错误: -1072896658

2006-03-13 @ 15:29:24 · 作者 volcano · 归类于 PHP, AJAX, JAVASCRIPT

上个礼拜整了个ajax调用yahoo搜索的demo,不想有网友发现search.htm会报javascript错 --- 系统错误: -1072896658.

他的服务器环境是apache 2.05+php4.3+ie6/firefox 1.07+windows server 2003,而我的服务器环境是apache 2.2+php5.1.2/php4.3+ie6/firefox 1.07+winxp.这个时候俺几乎就要把所有的错归结到windows server 2003身上了.但是对方可以正常查看我放在网上的demo,所以这跟windows的亲戚应该没太大干系,用-1072896658作为关键字 google了一下,很快有了答案.
http://www.panoramio.com/blog/explorer-system-error-1072896658/

如果XMLHttpRequest对象请求的文档未指定正确的utf-8编码,就会出现这个错误
浏览器系统错误:-1072896658(Explorer system error: -1072896658)

解决办法很简单,给代理proxy.php加上简单的一行就一切ok:

header('text/javascript; charset=utf-8'); 
header('Content-Type:text/html; charset=utf-8');
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">








posted @ 2009-12-25 23:33 Chenyunshi 阅读(298) | 评论 (0)编辑 收藏

YUI datatable 源码

     摘要: Java:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package org.diegochen.yuitut.base.controller;import java.io.PrintWriter;import java.util.List;imp...  阅读全文

posted @ 2009-10-30 13:49 Chenyunshi 阅读(833) | 评论 (0)编辑 收藏

Ubuntu下动态共享库(so)开发精悍教程


在网上找到一篇很棒的文章: http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

翻译并根据实际情况进行了小小修改,仅关注Linux下动态共享库(Dynamic shared library .so)的开发.

1 简单的so实例

源文件

//test1.c
int test1(){
    
return 1;
}

//test2.c
int test2(){
    
return2;
}

//mytest.c
#include <stdio.h>
int test1();
int test2();
int main(){
    printf(
"result of test1:= %d\n",test1());
    printf(
"result of test2:= %d\n",test2());
}

打包成so文件

在代码的目录下运行如下命令: (如果你不是Ubuntu系统,请将命令的sudo都去掉)

gcc -Wall -fPIC -c *.c
gcc -shared -Wl
,-soname,libctest.so.1 -o libctest.so.1.0   *.o
sudo mv libctest.so
.1.0 /usr/lib
sudo ln -sf /usr/lib/libctest.so
.1.0 /usr/lib/libctest.so
sudo ln -sf /usr/lib/libctest.so
.1.0 /usr/lib/libctest.so.1

参数详解:
  • -Wall: 包含warning信息
  • -fPIC: 编译动态库必须,输出不依赖位置的代码(原文 :Compiler directive to output position independent code)
  • -shared: 编译动态库必需选项
  • -W1: 向链接器(Linker)传递一些参数.在这里传递的参数有 "-soname libctest.so.1"
  • -o: 动态库的名字. 在这个例子里最终生成动态库 libctest.so.1.0
两个符号链接的含义:
  • 第一个:允许应用代码用 -lctest 的语法进行编译.
  • 第二个:允许应用程序在运行时调用动态库.

2 so路径设置

为了使应用程序能够在运行时加载动态库,可以通过3种方式指定动态库的路径(以下例子均假定/opt/lib是动态库所在位置):

用ldconfig指定路径

运行

sudo ldconfig -n /opt/lib

/opt/lib 是动态库所在路径.  这种方式简单快捷,便于程序员开发.缺点是重启后即失效.

修改/etc/ld.so.conf文件

打开/etc/ld.so.confg 文件,并将/opt/lib 添加进去.

(注: 在Ubuntu系统中, 所有so.conf文件都在/etc/ld.so.conf.d目录. 你可以仿照该目录下的.conf文件写一个libctest.conf并将/opt/lib填入)

用环境变量LD_LIBRARY_PATH指定路径

环境变量的名字一般是LD_LIBRARY_PATH, 但是不同的系统可能有不同名字. 例如

Linux/Solaris: LD_LIBRARY_PATH, SGI: LD_LIBRARYN32_PATH, AIX: LIBPATH, Mac OS X: DYLD_LIBRARY_PATH, HP-UX: SHLIB_PATH) (注: 此说法未经验证)

修改~/.bashrc , 增加以下脚本:


if 
[ -d /opt/lib ];
then
   LD_LIBRARY_PATH
=/opt/lib:$LD_LIBRARY_PATH
fi



export LD_LIBRARY_PATH

在第一章的简单例子中, /usr/lib 是Ubuntu默认的动态库目录,所以我们不须指定动态库目录也能运行应用程序.

3 简单的动态调用so例子


C调用例子

保留第一章的test1.c和test2.c文件,并增加ctest.h头文件如下:

#ifndef CTEST_H
#define CTEST_H

#ifdef __cplusplus
extern "C" {
#endif

int test1();
int test2();

#ifdef __cplusplus
}
#endif

#endif
      

我们继续使用第一章生成的libctest.so,仅需增加一个新的应用程序 prog.c:

//prog.c

#include <stdio.h>
#include 
<dlfcn.h>
#include 
"ctest.h"

int main(int argc, char **argv) 
{
   
void *lib_handle;
   
int (*fn)();
   
char *error;

   lib_handle 
= dlopen("libctest.so", RTLD_LAZY);
   
if (!lib_handle) 
   {
      fprintf(stderr, 
"%s\n", dlerror());
      
return 1;
   }

   fn 
= dlsym(lib_handle, "test1");
   
if ((error = dlerror()) != NULL)  
   {
      fprintf(stderr, 
"%s\n", error);
      
return 1;
   }

   
int y=fn();
   printf(
"y=%d\n",y);

   dlclose(lib_handle);
   
   
return 0;
}
       


然后用如下命令运行(由于没有使用其他库,所以忽略-L等参数):

gcc -Wall prog.c -lctest -o prog -ldl
.
/progdl

方法简介

dlopen("libctest.so", RTLD_LAZY): 加载动态库,如果加载失败返回NULL. 第二个参数可以是:
  • RTLD_LAZY: lazy模式. 直到源码运行到改行才尝试加载.
  • RTLD_NOW: 马上加载.
  • RTLD_GLOBAL: 不解(原文: Make symbol libraries visible.)
dlsym(lib_handle, "test1"): 返回函数地址. 如果查找函数失败则返回NULL.

和微软的动态加载dll技术对比如下:
  • ::LoadLibrary() - dlopen()
  • ::GetProcAddress() - dlsym()
  • ::FreeLibrary() - dlclose()

C++调用例子


增加一个prog2.cpp
#include <dlfcn.h>
#include 
<iostream>
#include 
"ctest.h"


using namespace std;
int main(){
    
void *lib_handle;
    
//MyClass* (*create)();
    
//ReturnType (* func_name)();
    int (* func_handle)();  
    
string nameOfLibToLoad("libctest.so");
    lib_handle 
= dlopen(nameOfLibToLoad.c_str(), RTLD_LAZY);
    
if (!lib_handle) {
        cerr 
<< "Cannot load library: " << dlerror() << endl;
    }
    
// reset errors
    dlerror();
    
// load the symbols (handle to function "test")
    
//create = (MyClass* (*)())dlsym(handle, "create_object");
    
//destroy = (void (*)(MyClass*))dlsym(handle, "destroy_object");
    func_handle =(int(*)())dlsym(lib_handle, "test1");

    
const char* dlsym_error = dlerror();
    
if (dlsym_error) {
        cerr 
<< "Cannot load symbol test1: " << dlsym_error << endl;
    }
    
    cout
<<"result:= "<<func_handle()<<endl;
    
    dlclose(lib_handle);
    
    
return 0;
}




然后用如下命令运行:

g++ -Wall prog2.cpp -lctest -o prog2 -ldl
.
/prog2

编译命令简介

假设C文件是prog.c, C++调用文件是prog2.cpp,那么编译脚本分别是:

C语言:

 gcc -Wall -I/path/to/include-files -L/path/to/libraries prog.c -lctest -o prog

C++语言:

 g++ -Wall -I/path/to/include-files -L/path/to/libraries prog2.cpp -lctest -ldl -o prog2

参数详解:
  • -I: 指定头文件目录.
  • -L: 指定库目录.
  • -lctest: 调用动态库libctest.so.1.0. 如果在打包so时没有创建第一个符号链接,那么这个参数会导致编译不成功.
  • -ldl: C++编译必须

相关知识


命令ldd appname 可以查看应用程序所依赖的动态库,运行如下命令:

ldd prog

在我的机器输出:

    linux-gate.so.1 =>  (0xb80d4000)
    libctest.so
.1 => /usr/lib/libctest.so.1 (0xb80be000)
    libc.so
.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7f5b000)
    /lib/ld-linux.so
.2 (0xb80d5000)

4 C++开发带class的so

//myclass.h
#ifndef __MYCLASS_H__
#define __MYCLASS_H__

class MyClass
{
public:
  MyClass();

  
/* use virtual otherwise linker will try to perform static linkage */
  
virtual void DoSomething();

private:
  
int x;
};

#endif

//myclass.cpp
#include "myclass.h"
#include 
<iostream>

using namespace std;

extern "C" MyClass* create_object()
{
  
return new MyClass;
}

extern "C" void destroy_object( MyClass* object )
{
  delete 
object;
}

MyClass::MyClass()
{
  x 
= 20;
}

void MyClass::DoSomething()
{
  cout
<<x<<endl;
}

//class_user.cpp
#include <dlfcn.h>
#include 
<iostream>
#include 
"myclass.h"

using namespace std;

int main(int argc, char **argv)
{
  
/* on Linux, use "./myclass.so" */
  
void* handle = dlopen("./myclass.so", RTLD_LAZY);

  MyClass
* (*create)();
  
void (*destroy)(MyClass*);

  create 
= (MyClass* (*)())dlsym(handle, "create_object");
  destroy 
= (void (*)(MyClass*))dlsym(handle, "destroy_object");

  MyClass
* myClass = (MyClass*)create();
  myClass
->DoSomething();
  destroy( myClass );
}


编译和运行:

 g++ -fPIC -shared myclass.cpp -o myclass.so
 g++ class_user.cpp -ldl -o class_user
 ./class_user





posted @ 2009-08-28 21:50 Chenyunshi 阅读(7564) | 评论 (0)编辑 收藏

精简Bash程序设计教程一:变量的使用


这篇教程是<Beginning  Linux Programming> 3rd 第二章的读书笔记.进行了一些小小的改动,更好突出主题.

1 起步走

这个例子说明了如何编写shell,声明变量,读入用户输入,引用变量

#!/bin/sh
#Author: Yunshichen
#Created at: 2009.08.19
a=Hello
echo 
"a is: "$a
#带空格的字符串必须要用双引号括起来.
#
a=Hello world!
#
echo "a is: "$a
a="Hello world!"
echo 
"a is: "$a
#=号两边不能有空格.
#
a = "Hello world!" 
echo "a is: "$a 

echo 
"What's your name?"
read aname
echo 
"hello, "$aname
exit 0

#知识点:
#
1>每个shell都以#!/bin/sh开头,文件名一般是xxx.sh
#
2>变量都存储为字符串
#
3>如果字符串包含空格,就必须用引号括起来
#
4>变量赋值时,等号两边不能有空格.
#
5>从终端读取变量不需要引号.
#
6>用$varname的方式引用变量值

把上述程序存为1.sh,打开文件所在的文件夹,依次执行

chmod +1.sh
.
/1.sh

就可以看到程序运行效果.

写完shell程序之后,都必须以上述方式改变文件属性,执行才能得到输出结果.以下不再赘述这个过程.

2 单引号的使用

#!/bin/sh
#Author: Yunshichen
#Created at: 2009.08.19
myvar="Hi there"
echo $myvar
echo 
"$myvar"
echo 
'$myvar'
echo \$myvar

echo Enter some text
read myvar
echo 
'$myvar' now equals $myvar
exit 0


#知识点:
#
1>单引号的作用
#
2>$可以通过\取消变量


3 参数变量

如果脚本程序在调用时带有参数,Linux就会创建一些额外的变量.姑且称之为参数变量

#!/bin/sh
#Author: Yunshichen
#Created at: 2009.08.19
echo "The separator between parameters is: $IFS"
echo 
"The program $0 is now running"
echo 
"There are $# parameters" 
echo 
"The first parameter was $1"
echo 
"The second parameter was $2"
echo 
"The parameter list was $*"
IFS
=''

echo 
"Using \$@,the parameter list was $@"

echo 
"Using \$*,The parameter list was $*"
exit 0


#知识点
#
1>$IFS : 分隔单词的字符,通常是空格,制表符和换行符.
#
1>$0: shell脚本的名字
#
2>$#: 传递给脚本的参数个数
#
3>$$: shell脚本的进程号
#
4>$1,$n..: 脚本程序的参数
#
5>$*: 在一个变量间列出所有参数,各个参数以IFS定义的分隔符分隔.
#
6>$@: 在一个变量间列出所有参数,不同的是参数不用IFS分隔.所以用$@比用$*更好.

将文件存为3.sh .输入 ./3.sh aaa bbb ccc 察看输出结果.












posted @ 2009-08-19 23:30 Chenyunshi 阅读(495) | 评论 (2)编辑 收藏

仅列出标题
共6页: 1 2 3 4 5 6 
<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

相册

搜索

最新评论

阅读排行榜

评论排行榜