2008年9月19日

linux shell快速参考

*********************************************************************
*1, 文件及权限
*********************************************************************
chmod who [operator] [permission] filename
相对模式:
operator: +/-
permission:r,w,x,l(给文件加锁),s(设置文件宿主或组set_ID),t(粘帖位)
绝对模式:
权限: r(2), w(4), x(1)
uid: owner(set_uid)(2), group(set_gid)(4), 粘帖位(1)
设置uid时把uid的绝对组合数字放在最前面
umask:
允许设置文件创建时的缺省模式, 对每一类用户存在相应的mask数字, 对于文件
该值最大为6, 因为系统不允许在创建文件时赋予执行权限, 对于目录来讲最大
值为7, 例子:

(目录) umask: 101 对应的权限为676

*********************************************************************
*2, 文件名替换
*********************************************************************
* 匹配任何字符串
? 匹配单个字符串
[...] 匹配其中的任何字符
[!...]匹配非!之后的字符


*********************************************************************
*3, shell 的输入与输出
*********************************************************************
echo 输出语句
read 变量1 变量2 ...
cat 用来显示文件 分割显示文件 显示控制字符
tee 把一个副本传递到标准输出同时也把另一个副本COPY到相应的文件中
shell 3个相关的文件描述符:
0 标准输入
1 标准输出
2 标准错误
文件重定向:
> 定向到文件
>> 追加到文件
对标准错误重定向时必须是文件描述符:
command 0/1/2 >/>> filename
command >/>> filename 0/1/2>&0/1/2

command < filename
command << delimiter 从标准输入中读入直到遇到delimiter分界符
command <&m 把m作为标准输入
command >&m 把标准输出重定向到m中去
command <&- 关闭标准输入


*********************************************************************
*4, shell 命令的执行顺序
*********************************************************************
&& 如:命令1 && 命令2 只有命令1返回真(0),命令2才被执行
|| 如:命令1 || 命令2 如果命令1执行失败, 则执行命令2
() 在当前shell执行一组命令, 如(命令1;命令2;...), 如用{}则组中所有的命令的输出
作为一个整体被重定向时,则放到子shell执行否则放到当前shell执行



*********************************************************************
*5, 文本过滤(正则表达式)
*********************************************************************
^ 匹配行首 如^c
$ 只匹配行尾 如$c
* 一个单字符后跟*, 匹配0或多个此字符
[] 匹配[]内字符, 可以是单字也可以是字符序列, 也可以使用-表示字符范围,如[1-5]
\ 用来匹配一个元字符的特殊含义
. 匹配任意单字符
pattern\{n\} 匹配前面的pattern,n为次数
pattern\{n,\}m 同上但次数至少为n
patterb\{n,m\} 同上但次数在n与m之间


*********************************************************************
*5, awk, 主要用来格式化文本
*********************************************************************
awk脚本:
可以使用-F指定分割符, 如果未指定则使用空格
模式和动作:
模式可以式任何语句, 模式包含BEGIN和END两个字段, 实际动作在{}内指定, 模式可
以省略
域和记录:
awk执行时其浏览域标识为$1,$2..., 使用$0表示使用所有域
正则表达式:
除了grep的正则表达式之外,awk还支持另外两个:
+ 匹配一个或多个字符
? 匹配模式出现频率,如/XY?Z/匹配XYZ和XZ
表达式需要用斜线括起来
条件操作符:
<, <=, ==,!=, >, >=, ~(匹配正则表达式), !~(不匹配正则表达式), 如:
awk '{if($4~/brown/) print $0}' grade.txt
符合表达式:
&& 语句两边必须同时匹配为真
|| 语句两边必须有一个匹配为真
! 非
内置变量:
ARGC 命令行参数个数
ARGV 命令行参数排列, 每个参数使用ARGV[n]访问, 下标以0开始
ENVIRON 支持队列中系统环境变量的使用, 如ENVIRON["PATH"] = "usr/local/bin"
FILENAME awk浏览的文件名,
FNR 浏览文件的记录数
FS 设置输入域分割符等价于-F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分割符, 缺省为空格
ORS 输出记录的分割符, 缺省为\n
RS 记录分割符号, 缺省为\n

操作符:
=, +=, *=, /=, %=, ^=
? 条件表达式操作符
||, &&, !
~, !~
<,<=,==,!=,>,>=
+,-,*,/,%,^
++, --
内置字符串函数:
gsub(r,s), 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字串t的第一位置
length(s)
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs)在fs上将s分成序列a
sprintf(fmt,exp), 经格式化后的exp
sub(r,s) 用$0中最左边最长的字符串代替s
substr(s,p) 返回s中以p开始的部分
substr(s,p,n)
输出函数:
printf([格式控制符], 参数)

修饰符:
格式:
- 左对齐
.prec 最大字符串长度或小数点右边的位数
Width 域的步长, 用0表示0步长

格式符号:
%c 字符
%d
%e
%f
%g awk决定使用哪种浮点数转换e或者f
%o 八进制数
%s
%x 十六进制

awk数组:
使用数组前不必定义也不必指定数组元素的个数, 如:
'{split("123#224#245", myarrary, "#")}'

也可以先定义再使用.



*********************************************************************
*6, sed 文本过滤工具
*********************************************************************
sed [选项] sed命令 输入文件
sed [选项] -f 脚本文件 输入文件

查询方式:
sed默认从第一行开始
定位方式:
x 为一行号
x,y 行范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 在指定的行上查询包含模式的行
x,/pattern/ 通过行号和模式查询匹配行
x,y!查询不包含指定行号x,y的行

命令:
p 打印匹配行
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号号插入新文本信息
d 删除定位行
c\ 用新文本替换定位行
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配后退出
l 显示与8进制ASCII代码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读取下一行, 并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行, 允许跨行的模式匹配语句


例子:
sed -n '2p' filename 第二行开始
sed -n '1,3p' filename 1~3行
sed -n '/pattern/p' filename
sed -n '4,/pattern/p'
sed -n '1,$p' filename 显示整个文件, $表示最后一行
sed -n '/pattern/=' 显示行号
sed '/pattern/a\text' 附加文本,在指定行后面
sed '4i\text' 插入文本, 在指定行前面
sed '/pattern/c\text' 替换指定行





替换文本:
[address[,address]] s/pattern-to-find/replace-pattern/[g p w n]
g 缺省只替换一次出现模式, 使用g替换全局所有模式
p 缺省sed将所有被替换行写入标准输出,使用p将不打印结果
w 文件名 将输出定向到一个文件




*********************************************************************
*7, 工具
*********************************************************************
tr 字符转换删除和替换
stty 设置终端特性



*********************************************************************
*8, shell环境及变量
*********************************************************************
本地变量:
variable-name = value 设置实际值到变量
variable-name + value 如果设置了variable-name则重设其值
variable-name :? value 如果未设置variable-name 显示未定义用户错误信息
variable-name ? value 如果未设置variable-name 显示系统错误信息
variable-name := value 如果未设置设置其值, 如果设置则使用原值
variable-namne :- value 如果未设置使用value替换但并不设置value到variable-name, 如果设置
则使用其值
unset variable 清除变量
set variable value 设置变量 如果不提供参数则显示所有本地变量
测试变量是否设置值:
echo "The file is ${FILE?}"
echo "The file is ${FILE:? sorry ....}"
设置只读变量:
readonly variable-name
设置环境变量:
export variable-name
env 显示所有环境变量
unset variable 清除环境变量

预留的变量名:
CDPATH cd 一个目录时查找此变量
EXINIT 保存VI初始化时的设置
HOME HOME目录
LFS 用来指定shell缺省的分割符
LOGNAME 保存登陆名
MAIL 保存邮箱路径名
MAILCHECK 缺省为每60秒检查一次新邮件
MAILPATH 如果有多个邮箱要用到MAILPATH,此变量将覆盖MAIL设置
PS1 shell提示符,缺省对root为#, 其他用户为$
PS2 shell附属提示符, 缺省为>, 用于执行超过一行的一个命令
SHELL 缺省shell
TERMINFO 终端初始化变量保存终端初始化配置
TERM 终端类型
TZ 时区
EDITOR 缺省的编辑器
PWD 当前路径名
PAGER 屏幕翻页命令
MANPATH man路径
PRINTER 缺省打印机名

向脚本传递参数, 用空格分割, $0~$9 其中$0始终保存的脚本名

特定变量参数:
$# 传递到脚本的参数个数
$* 以单个字符变量显示所有传递的参数,此选项参数可以超过9个
$$ 当前脚本进程的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同但是使用时加引号
$- SHELL的当前选项,与set相同
$? 显示命令的最后退出状态, 0为没错误, 其他任何值表示有错误



*********************************************************************
*9, 引号
*********************************************************************
使用单引号可以引用除字符$,反引号,\以外的任何字符
使用双引号可以引用任何值
使用反引号用于将系统命令输出到变量
反斜线引用特殊字符:&*+^$'""|?


*********************************************************************
*10, 条件测试
**********************************************************************
测试文件状态:
test condition 或 [ condition ] 使用[]要在两边加上空格
-d 目录
-f 正规文件
-L 符号连接
-r 可读
-s 文件长度大于0非空
-w 可写
-u 文件具有suid位设置
-x 可执行
-e 存在
-b 块文件
-c 字符设备文件
-g 设置了guid位
...
如: [ -f filename ]
echo $?

测试时使用逻辑操作:
-a 逻辑与 -o 逻辑或 !逻辑非, 如:
[ -w result.txt -a -w test.txt ]
字符串测试:
test "string"
test string_operator "string"
test "string" string_operator "string"
string_operator:
= 相等
!= 不等
-z 空串
-n 非空串
测试数值:
"number" number_operator "number"

[ "number" number_operator "number" ]
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
expr 用于数值计算:
exper argument operator argument


**********************************************************************
*11, 控制流结构
**********************************************************************
if-else:
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令3
fi
空命令永远为真
case 语句:
case 值 in
模式1)
命令1
...
;;
模式2)
命令2
...
;;
esac

for循环:
for 变量名 in 列表
do
命令1
命令2
...
done

until循环:
until 条件
do
命令1
命令2
...
done

while 循环:
while 命令
do
命令1
命令2
...
done

可以使用break continue 控制流程, 对case及循环有效


*********************************************************************
*12, shell 函数
*********************************************************************
格式:
函数名()
{
命令1
命令2
} 或
函数名() {
}
也可以在函数名前面加上function
参数传递:
和在shell中使用参数一样如$1 ~ $9, 如:
test() {
echo $1
echo $2
echo $3
}
调用: test 1 2 3
函数返回:
return 返回用最后的命令状态决定返回值
return 0
return 1
在shell中定位文件:
定位格式为:
. pathname
执行函数:
函数名 参数 ...
删除函数:
unset 函数名


*********************************************************************
*13, 向脚本传递参数
*********************************************************************
shift 命令:
他每执行一次参数个数减一且值向前移动一位,如:
while [ $# -ne 0 ]
do
echo $1
shift
done


********************************************************************
*14, 创建屏幕输出
********************************************************************
tput:
字符输出:
bel 警铃
blink 闪烁
bold 粗体
civis 隐藏光标
clear 清屏
cnorm 不隐藏光标
cup 移动光标位置到x,y
el 清除到行尾
ell 清除到行首
smso 启动突出显示
rmso 正常显示
smul 开始下划线模式
rmul 停止下划线模式
sc 保存当前光标位置
rc 恢复光标位置
sgr0 正常屏幕
rev 逆转视图

数字输出:
cols 列数目
it TAB设置宽度
lines 屏幕行数

布尔输出:
chts 光标不可见
hs 具有状态行
例子, 使用布尔输出:
STATUS_LINE=`tput hs`
if $STATUS_LINE; then
echo "Your terminal has a status line"
else
echo "Your terminal don't has a status line"
fi


使用颜色:
前景色:
30(黑) 31(红) 32(绿) 33(黄) 34(蓝) 35(紫) 36(青) 37(白)
背景色:
40(黑) 41(红) 42(绿) 43(黄) 44(蓝) 45(紫) 46(青) 47(白)

颜色格式:
[background_number;foreground_number]m
例子:
echo -e "\033[40;32m"

展开 Read More...

2008年9月11日

条件跳转参考

1.无符号数的条件转移指令

指令的助忆符

JE/JZ
ZF=1 Jump Equal or Jump Zero

JNE/JNZ
ZF=0 Jump Not Equal or Jump Not Zero

JA/JNBE
CF=0 and ZF=0 Jump Above or Jump Not Below or Equal

JAE/JNB
CF=0 Jump Above or Equal or Jump Not Below

JB/JNAE
CF=1 Jump Below or Jump Not Above or Equal

JBE/JNA
CF=1 or AF=1 Jump Below or Equal or Jump Not Above


2.有符号数的条件转移指令

指令的助忆符

JE/JZ
ZF=1 Jump Equal or Jump Zero

JNE/JNZ
ZF=0 Jump Not Equal or Jump Not Zero

JG/JNLE
ZF=0 and SF=OF Jump Greater or Jump Not Less or Equal

JGE/JNL
SF=OF Jump Greater or Equal or Jump Not Less

JL/JNGE
SF≠OF Jump Less or Jump Not Greater or Equal

JLE/JNG
ZF=1 or SF≠OF Jump Less or Equal or Jump Not Greater

3.特殊算术标志位的条件转移指令

指令的助忆符
检测的转移条件 功能描述
JC
CF=1 Jump Carry

JNC
CF=0 Jump Not Carry

JO
OF=1 Jump Overflow

JNO
OF=0 Jump Not Overflow

JP/JPE
PF=1 Jump Parity or Jump Parity Even

JNP/JPO
PF=0 Jump Not Parity or Jump Parity Odd

JS
SF=1 Jump Sign (negative)

JNS
SF=0 Jump No Sign (positive)


展开 Read More...

2008年8月12日

对话框置顶

按照windows核心编程思路,在MFC框架下开发相应功能
调用SetWindowspos会出现
cannot convert parameter 1 from 'struct HWND__ *' to 'const class CWnd *'
解决方法:



In your dialog's OnInitDialog() function, just add this line

SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);


展开 Read More...

eclipse scim输入

默认ctrl+space调不出来
方法1:
eclipse中右键 -> Input methods -> scim


方法2:
还未找到,

这篇文章的方法我试了无效,等重启再看效果

展开 Read More...

2008年8月4日

java实现某题

周末搞了好久没搞出来,很不舒服。




package 字符串操作;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

/** 输入字符格式:
* <p>
* 大小 字符1 字符2 ...
* <p>
* 每两行,进行一次处理
* <p>
* 比如:
* <p>
* 2 1 3
* <p>
* 4 9 19 29 0
* <p>
* 排序后得到
* <p>
* 6 0 1 3 9 19 29
* <p>
* PS:baidu一贴,用c语言写了一天没写出来,很郁闷,字符串的处理,内存的管理烦死了
* 于是用java写了下,1个小时内吧,哎~~~
* @author gnuser
*
*
*/
class 输入字符串对 {
String[] r0;
String[] r1;
int[] result;

public 输入字符串对(String[] r0, String[] r1) {
super();
this.r0 = r0;
this.r1 = r1;
}
public 输入字符串对() {
}
/**
* 将r0,r1合并后,转换为整形数组
*/
public void changeMig() {
int[] s = new int[r0.length + r1.length];
for(int i=0; i<r0.length; i++)
{
s[i] = Integer.parseInt(r0[i]);
}

for(int i=0; i<r1.length; i++)
{
s[r0.length+i] = Integer.parseInt(r1[i]);
}
this.setResult(s);
}
/**
* 排序后打印
*/
public void printSorted() {
int[] rs = this.getResult();
Arrays.sort(rs);
System.out.print(rs.length + " ");
for(int i=0; i<rs.length; i++)
System.out.print(rs[i] + " ");
System.out.println();
}

public String[] getR0() {
return r0;
}
public void setR0(String[] r0) {
this.r0 = r0;
}
public String[] getR1() {
return r1;
}
public void setR1(String[] r1) {
this.r1 = r1;
}
public int[] getResult() {
return result;
}
public void setResult(int[] result) {
this.result = result;
}


}
public class 分割_排序_输入 {
输入字符串对 ip;

public 输入字符串对 getIp() {
return ip;
}

public void setIp(输入字符串对 ip) {
this.ip = ip;
}

public 分割_排序_输入() {
super();
ip = new 输入字符串对();
}

public void BOBO() throws IOException
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
String s;
String[] r0 = null,r1 = null;
int row = 0;
while((s = stdin.readLine()) != null && s.length() != 0)
{
if(s.trim().equals("q"))
break;
if((row++) % 2 == 0)
r0 = s.substring(2).split(" ");
else
{
r1 = s.substring(2).split(" ");
ip.setR0(r0);
ip.setR1(r1);
ip.changeMig();
ip.printSorted();
}
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
分割_排序_输入 fps = new 分割_排序_输入();
fps.BOBO();
}

}


展开 Read More...

2008年7月31日

emacs实现键盘录制功能

就像按键精灵的录制功能,emacs也轻松能做到,帅

将下面的代码拷贝到配置文件,一般c:/_emacs或者~/.emacs



(global-set-key [(f3)] 'start-kbd-macro)
(global-set-key [(f4)] 'end-kbd-macro)
(defun call-last-kbd-macro-N-times (n)
"Call call-last-kbd-macro N times."
(interactive "How many times?")
(call-last-kbd-macro n))
(global-set-key [(f5)] 'call-last-kbd-macro-N-times)

使用方法:

按f3开始录制,然后按键(鼠标无效), f4结束
f5,输入重复次数。
于是重复编辑动作瞬间完成

或者录制好后,按c-x e,然后每次执行后,按e,则重复执行,按住不放吧,boy^_^

展开 Read More...

2008年7月11日

Eclipse编码保存出错

保存时出现一下错误。

Save could not be completed. Reason: some characters cannot be mapped using “ISO-8859-1“ character encoding. Either change the encoding or remove the characters which are not supported by the “ISO-8859-1“ character encoding.


解决方法:
eclipse --> window --> Preferences --> General --> Content Types --> Test --> 单击 Java Properties File,在底部出现 'Default edcodng:',改成utf-8或GBK,然后update

展开 Read More...

2008年5月20日

排序算法

選擇排序
將要排序的對象分作兩部份,一個是已排序的,一個是未排序的,從後端未排序部份選擇一個最小值,並放入前端已排序部份的最後一個,例如:

排序前:70 80 31 37 10 1 48 60 33 80

[1] 80 31 37 10 70 48 60 33 80 選出最小值1
[1 10] 31 37 80 70 48 60 33 80 選出最小值10
[1 10 31] 37 80 70 48 60 33 80 選出最小值31
[1 10 31 33] 80 70 48 60 37 80 ......
[1 10 31 33 37] 70 48 60 80 80 ......
[1 10 31 33 37 48] 70 60 80 80 ......
[1 10 31 33 37 48 60] 70 80 80 ......
[1 10 31 33 37 48 60 70] 80 80 ......
[1 10 31 33 37 48 60 70 80] 80 ......




插入排序
像是玩樸克一樣,我們將牌分作兩堆,每次從後面一堆的牌抽出最前端的牌,然後插入前面一堆牌的適當位置,例如:

排序前:92 77 67 8 6 84 55 85 43 67


[77 92] 67 8 6 84 55 85 43 67 將77插入92前
[67 77 92] 8 6 84 55 85 43 67 將67插入77前
[8 67 77 92] 6 84 55 85 43 67 將8插入67前
[6 8 67 77 92] 84 55 85 43 67 將6插入8前
[6 8 67 77 84 92] 55 85 43 67 將84插入92前
[6 8 55 67 77 84 92] 85 43 67 將55插入67前
[6 8 55 67 77 84 85 92] 43 67 ......
[6 8 43 55 67 77 84 85 92] 67 ......
[6 8 43 55 67 67 77 84 85 92] ......


氣泡排序法
顧名思義,就是排序時,最大的元素會如同氣泡一樣移至右端,其利用比較相鄰元素的方法,將大的元素交換至右端,所以大的元素會不斷的往右移動,直到適當的位置為止。


基本的氣泡排序法可以利用旗標的方式稍微減少一些比較的時間,當尋訪完陣列後都沒有發生任何的交換動作,表示排序已經完成,而無需再進行之後的迴圈比較與交換動作,例如:

排序前:95 27 90 49 80 58 6 9 18 50


27 90 49 80 58 6 9 18 50 [95] 95浮出
27 49 80 58 6 9 18 50 [90 95] 90浮出
27 49 58 6 9 18 50 [80 90 95] 80浮出
27 49 6 9 18 50 [58 80 90 95] ......
27 6 9 18 49 [50 58 80 90 95] ......
6 9 18 27 [49 50 58 80 90 95] ......
6 9 18 [27 49 50 58 80 90 95] 由於接下來不會再發生交換動作,排序提早結束


展开 Read More...

2008年4月18日

vc6.0选择DEBUG方式编译

在编译,执行那几个toolbar旁边的空白处右键

选择 组建, 下拉框选择debug或者release, 编译即可

隐藏

展开 Read More...

2008年4月17日

mfc组合框高度调整


组合框默认高度很短,可以自定义高度

点击组合框的下拉按钮,拖动可改变长度,编译即可

展开 Read More...

a duplicate insert block exists for class CDialog

重新学习mfc啦, 又遇到了以前遇到的问题, 以前有老师在, 就没加下方法, 现在有google在, 不过千万别看中文的解决方法.

原因就是mfc假死了, 一直在那儿build,又build不出来个究竟, 怒了, 直接灭掉. 于是资源出现问题了,刚建的对话框没了,于是删啊删啊, 把该删的都删了,重新创建对话框还是有错误(见标题), 于是google之,



解决方法: 删除不要的dialog.cpp, dialog.h, .clw文件, 重新打开vc, ctrl+w进入类视图, 直接点ok重建,就好了

危害:不想重头来过的话,解决它吧!

展开 Read More...