if[空格 条件 空格] 注意空格!!否则shell无法解析
Shell Scripts学习之if
–b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当pathname指定的文件或目录存在时返回真 -f 当file存在并且是正规文件时返回真 -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真 -h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效 -k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真 -p 当file存在并且是命令管道时返回为真 -r 当由pathname指定的文件或目录存在并且可读时返回为真 -s 当file存在文件大小大于0时返回真 -u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真 -w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。 -o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
阅读全文
Shell Scripts学习之if
–b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当pathname指定的文件或目录存在时返回真 -f 当file存在并且是正规文件时返回真 -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真 -h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效 -k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真 -p 当file存在并且是命令管道时返回为真 -r 当由pathname指定的文件或目录存在并且可读时返回为真 -s 当file存在文件大小大于0时返回真 -u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真 -w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。 -o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。

我们经常会遇到需要取出分字段的文件的某些特定字段,例如 /etc/password就是通过":"分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以:
cut -d: -f 1 /etc/passwd > /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段
当然也可以通过cut取得文件中每行中特定的几个字符,例如:
cut -c3-5 /etc/passwd
就是输出/etc/passwd文件中每行的第三到第五个字符。
-c 和 -f 参数可以跟以下子参数:
N 第N个字符或字段
N- 从第一个字符或字段到文件结束
N-M 从第N个到第M个字符或字段
-M 从第一个到第N个字符或字段
cut -d: -f 1 /etc/passwd > /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段
当然也可以通过cut取得文件中每行中特定的几个字符,例如:
cut -c3-5 /etc/passwd
就是输出/etc/passwd文件中每行的第三到第五个字符。
-c 和 -f 参数可以跟以下子参数:
N 第N个字符或字段
N- 从第一个字符或字段到文件结束
N-M 从第N个到第M个字符或字段
-M 从第一个到第N个字符或字段
cut 使用 将原串通过 符号 分割成行 cut -d 分割符号 第几行 ( f几 ) ( -f几 )
awk 将原串通过 符号 分割成行 awk -F 分割符号 "{print $几 }" 默认为空格
#!/bin/sh
udpstr=`netstat -anp | grep 7001 | cut -d "*" -f2 | cut -d "/" -f1 '`
if[-z "$udpstr"]
then
$udpid = ` echo $udpstr | tr -d ' ' ` #去掉空格
kill "$udpid"
fi
tcpstr=`netstat -anp | grep 7002 | cut -d "*" -f2 | cut -d "/" -f1 '`
if[-z "$tcpstr"]
then
$tcpid = ` echo $tcpstr | tr -d ' ' ` #去掉空格
kill "$tcpid"
else
exit 1
fi
cd /var/www/html/modules/sag_manager/socket
php -q /var/www/html/modules/sag_manager/socket/socket.server.php
exit $?
shell的一些语法:
表 31.4. 常用的位置参数和特殊变量
$0 相当于C语言main函数的argv[0]
$1、$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv
[2]...
$# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
$@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
$? 上一条命令的Exit Status
$$ 当前Shell的进程号
用户可以比较两个字符串相等或不等,也可以测试一个串是否赋了值。有关串的操作符如下:
str1 = str2 当两个串有相同内容、长度时为真
str1 != str2 当串str1和str2不等时为真
-n str1 当串的长度大于0时为真(串非空)
-z str1 当串的长度为0时为真(空串)
str1 当串str1为非空时为真
1、 set命令
当没有参数的时候,列出系统中所有的自定义变量值;当有参数的时候,重置基本参数如$1、$2等。如set
`date` 将date命令的输出当作输入参数;
2、let命令
执行算术运算。功能如i=j+1,shell语法为:
let “i=$j+1”,等同于 ‘expr’。 后者只能作用于整数,如 i=`expr $i+1`; 如果使用非整数
,退出状态不为0
3、expr
expr也有模式匹配功能。
可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次。
$value=accounts.doc
$expr $value : '.*'
输出:12
在expr中可以使用字符串匹配操作,这里使用模式. d o c抽取文件附属名。
$expr $value : '\(.*\).doc' 在圆括号前加转义符号是表示圆括号是用于提取功能的。
输出:accounts
4、shift命令
将参数表向左移动一个位置,$2变成$1,...,依次类推。
5、shell中可以嵌套命令,使用\`来保护内层命令,如`cd \`pwd\``。
6、设置IFS为换行符:IFS=’
’(还真得换行)
7、两个特殊操作
命令1 && 命令2 :只有在命令1执行成功时才执行命令2;
命令1 || 命令2 :命令1失败才执行命令2;
8、变量赋值
“”引用的字符串需要shell解析其中的``、$、\等特殊字符,而’’引用的字符串则被看作完全的
字符串,echo ‘`pwd`’将输出`pwd`;而echo “`pwd`”将输出当前目录;
变量
含义
$var
Var的值,若无定义则无值
${var}
同上,用于同$varx等类型变量区分
${var-thing}
Var有定义时,取值$var;无定义时取值thing,而$var不变
${var=thing}
Var有定义时,取值$var;无定义时取值thing,$var值设为thing
${var?message}
有定义时取值$var;否则打印message并退出shell,若message为空串,打印var:parameter not set
${var+thing}
有定义时取值thing;否则无值
9、shell内部变量
变量
含义
$#
参数个数
$*
所有参数
$@
同上,稍有区别
$-
Shell的选择项
$?
上次执行命令返回值
$$
Shell的进程标识符
$!
用&启动的最后一个命令的进程标识符
$HOME
cd命令的缺省参数
$IFS
参数分割词的字符表
$MAIL
信件文件,当其改变时给出信息you have mail
$PATH
搜索命令的目录表
$PS1
提示符串,缺省为$
$PS2
后继命令行提示符,缺省为>
有关$*和$@得归纳:
$*和$@扩展为参数,并被重复扫描;参数得空格将字符串分成多个参数;
“$*”表示shell文件的所有参数及其空格连在一起作为单个词处理;
“$@”与shell文件接收的参数等价,参数中的空格被忽略,其结果是等同于原来参数的一个单词列表。
10、 shell模式匹配规则
* 匹配任意字符串,包括空字符串
? 匹配任意单字符串
[ABC] 匹配ABC中任意字符
“…” 完全与…匹配,引号保护特殊字符,也可以写成’…’
\C 匹配C
11、 case语句
case word in
模式1) 命令;;
模式2) 命令;;
…
*) 命令[;;]
esac
只能匹配一个模式
12、 if 语句
if 命令
then
else
fi
其中换行很重要,then、else和fi仅在换行或分号之后被识别,else部分可选。可以利用case语句替代if
和test测试语句,对于test命令不是内部命令的情况下,case语句执行的要快;
13、循环
1)for i [in 文件(参数)列表]
do
循环体
done
如果i后面没有in部分,则隐含地表示对shell文件的全部参数,即$*
2) While 命令
do
循环体,只要命令返回状态为真便继续进行
done
3)until 命令
do
循环体,只要命令返回状态为假便继续执行
Done
例如:
While sleep 60
do
…
Done
每隔60秒执行一次循环中的操作;
另外,where处的控制命令可以是true、false、或者是:,冒号命令是一个shell内部命令,仅仅计
算参数值,然后返回“真”,但是它不需要调用系统中的命令,所以效率比true命令高;
4)break命令:退出循环,取自C语言。
14、点号命令:
将文件作为标准输入,从中读入一行一行的命令在当前shell中执行,不要求文件具有可执行权限;
15、 文件命令习惯,后面加上当前进程号码$$为好
16、标准输入命令read
$read greeting
Hello,world
$echo $greeting
Hello,world
17、here document 输入
<
<<’s’ 同上,不进行替换。
<<\s 同上。
awk 将原串通过 符号 分割成行 awk -F 分割符号 "{print $几 }" 默认为空格
#!/bin/sh
udpstr=`netstat -anp | grep 7001 | cut -d "*" -f2 | cut -d "/" -f1 '`
if[-z "$udpstr"]
then
$udpid = ` echo $udpstr | tr -d ' ' ` #去掉空格
kill "$udpid"
fi
tcpstr=`netstat -anp | grep 7002 | cut -d "*" -f2 | cut -d "/" -f1 '`
if[-z "$tcpstr"]
then
$tcpid = ` echo $tcpstr | tr -d ' ' ` #去掉空格
kill "$tcpid"
else
exit 1
fi
cd /var/www/html/modules/sag_manager/socket
php -q /var/www/html/modules/sag_manager/socket/socket.server.php
exit $?
shell的一些语法:
表 31.4. 常用的位置参数和特殊变量
$0 相当于C语言main函数的argv[0]
$1、$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv
[2]...
$# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
$@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
$? 上一条命令的Exit Status
$$ 当前Shell的进程号
用户可以比较两个字符串相等或不等,也可以测试一个串是否赋了值。有关串的操作符如下:
str1 = str2 当两个串有相同内容、长度时为真
str1 != str2 当串str1和str2不等时为真
-n str1 当串的长度大于0时为真(串非空)
-z str1 当串的长度为0时为真(空串)
str1 当串str1为非空时为真
1、 set命令
当没有参数的时候,列出系统中所有的自定义变量值;当有参数的时候,重置基本参数如$1、$2等。如set
`date` 将date命令的输出当作输入参数;
2、let命令
执行算术运算。功能如i=j+1,shell语法为:
let “i=$j+1”,等同于 ‘expr’。 后者只能作用于整数,如 i=`expr $i+1`; 如果使用非整数
,退出状态不为0
3、expr
expr也有模式匹配功能。
可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次。
$value=accounts.doc
$expr $value : '.*'
输出:12
在expr中可以使用字符串匹配操作,这里使用模式. d o c抽取文件附属名。
$expr $value : '\(.*\).doc' 在圆括号前加转义符号是表示圆括号是用于提取功能的。
输出:accounts
4、shift命令
将参数表向左移动一个位置,$2变成$1,...,依次类推。
5、shell中可以嵌套命令,使用\`来保护内层命令,如`cd \`pwd\``。
6、设置IFS为换行符:IFS=’
’(还真得换行)
7、两个特殊操作
命令1 && 命令2 :只有在命令1执行成功时才执行命令2;
命令1 || 命令2 :命令1失败才执行命令2;
8、变量赋值
“”引用的字符串需要shell解析其中的``、$、\等特殊字符,而’’引用的字符串则被看作完全的
字符串,echo ‘`pwd`’将输出`pwd`;而echo “`pwd`”将输出当前目录;
变量
含义
$var
Var的值,若无定义则无值
${var}
同上,用于同$varx等类型变量区分
${var-thing}
Var有定义时,取值$var;无定义时取值thing,而$var不变
${var=thing}
Var有定义时,取值$var;无定义时取值thing,$var值设为thing
${var?message}
有定义时取值$var;否则打印message并退出shell,若message为空串,打印var:parameter not set
${var+thing}
有定义时取值thing;否则无值
9、shell内部变量
变量
含义
$#
参数个数
$*
所有参数
$@
同上,稍有区别
$-
Shell的选择项
$?
上次执行命令返回值
$$
Shell的进程标识符
$!
用&启动的最后一个命令的进程标识符
$HOME
cd命令的缺省参数
$IFS
参数分割词的字符表
信件文件,当其改变时给出信息you have mail
$PATH
搜索命令的目录表
$PS1
提示符串,缺省为$
$PS2
后继命令行提示符,缺省为>
有关$*和$@得归纳:
$*和$@扩展为参数,并被重复扫描;参数得空格将字符串分成多个参数;
“$*”表示shell文件的所有参数及其空格连在一起作为单个词处理;
“$@”与shell文件接收的参数等价,参数中的空格被忽略,其结果是等同于原来参数的一个单词列表。
10、 shell模式匹配规则
* 匹配任意字符串,包括空字符串
? 匹配任意单字符串
[ABC] 匹配ABC中任意字符
“…” 完全与…匹配,引号保护特殊字符,也可以写成’…’
\C 匹配C
11、 case语句
case word in
模式1) 命令;;
模式2) 命令;;
…
*) 命令[;;]
esac
只能匹配一个模式
12、 if 语句
if 命令
then
else
fi
其中换行很重要,then、else和fi仅在换行或分号之后被识别,else部分可选。可以利用case语句替代if
和test测试语句,对于test命令不是内部命令的情况下,case语句执行的要快;
13、循环
1)for i [in 文件(参数)列表]
do
循环体
done
如果i后面没有in部分,则隐含地表示对shell文件的全部参数,即$*
2) While 命令
do
循环体,只要命令返回状态为真便继续进行
done
3)until 命令
do
循环体,只要命令返回状态为假便继续执行
Done
例如:
While sleep 60
do
…
Done
每隔60秒执行一次循环中的操作;
另外,where处的控制命令可以是true、false、或者是:,冒号命令是一个shell内部命令,仅仅计
算参数值,然后返回“真”,但是它不需要调用系统中的命令,所以效率比true命令高;
4)break命令:退出循环,取自C语言。
14、点号命令:
将文件作为标准输入,从中读入一行一行的命令在当前shell中执行,不要求文件具有可执行权限;
15、 文件命令习惯,后面加上当前进程号码$$为好
16、标准输入命令read
$read greeting
Hello,world
$echo $greeting
Hello,world
17、here document 输入
<
<<’s’ 同上,不进行替换。
<<\s 同上。
在写shell脚本的时候遇到了一个问题,对于下面这个字符串,想把后面从/local开始截取出来。
/work/lib-optimizer/test/local/lib/libcrypto.so.0.9.8
请教同事,知道了一个方法,可以用cut命令,如上面我需要将从local开始的路径截取出来,就可以如下操作
path=/work/lib-optimizer/test/local/lib/libcrypto.so.0.9.8
echo $path | cut -b25-
可是这样,我就得一个个的数要截掉多少个,前面一变动,又得数,呵呵。。。让我想起了初学数学是用手指头数数的时候了 :P 。这样对我现在这种情况来讲不方便,所以网上搜搜,搜到了下面这个小技巧,网上的都没有例子,而且有的说的还不准确,实验了几次才找到正确的。在这里顺便带上个例子。
${varible##*string} 从左向右截取最后一个string后的字符串
${varible#*string}从左向右截取第一个string后的字符串
${varible%%string*}从右向左截取最后一个string后的字符串
${varible%string*}从右向左截取第一个string后的字符串
“*”只是一个通配符可以不要
例子如下:
[xiangyu@localhost ~]$ a="finding"
[xiangyu@localhost ~]$ echo ${a##*in}
g
[xiangyu@localhost ~]$ echo ${a#*in}
ding
[xiangyu@localhost ~]$ echo ${a%%in*}
f
[xiangyu@localhost ~]$ echo ${a%in*}
find
好了,为了让这个字符串截取完整些,把另外些方法也一并贴出来吧!
一、Linux shell 截取字符变量的前8位,有方法如下:
1.expr substr “$a” 1 8
2.echo $a|awk ‘{print substr(,1,8)}’
3.echo $a|cut -c1-8
4.echo $
5.expr $a : ‘\(.\\).*’
6.echo $a|dd bs=1 count=8 2>/dev/null
二、按指定的字符串截取
上面带例子的是第一种方法。
还有一种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。
可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga
这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。
三、按照指定要求分割:
比如获取后缀名
ls -al | cut -d “.” -f2
http://www.bsdlover.cn/html/25/n-3225.html
/work/lib-optimizer/test/local/lib/libcrypto.so.0.9.8
请教同事,知道了一个方法,可以用cut命令,如上面我需要将从local开始的路径截取出来,就可以如下操作
path=/work/lib-optimizer/test/local/lib/libcrypto.so.0.9.8
echo $path | cut -b25-
可是这样,我就得一个个的数要截掉多少个,前面一变动,又得数,呵呵。。。让我想起了初学数学是用手指头数数的时候了 :P 。这样对我现在这种情况来讲不方便,所以网上搜搜,搜到了下面这个小技巧,网上的都没有例子,而且有的说的还不准确,实验了几次才找到正确的。在这里顺便带上个例子。
${varible##*string} 从左向右截取最后一个string后的字符串
${varible#*string}从左向右截取第一个string后的字符串
${varible%%string*}从右向左截取最后一个string后的字符串
${varible%string*}从右向左截取第一个string后的字符串
“*”只是一个通配符可以不要
例子如下:
[xiangyu@localhost ~]$ a="finding"
[xiangyu@localhost ~]$ echo ${a##*in}
g
[xiangyu@localhost ~]$ echo ${a#*in}
ding
[xiangyu@localhost ~]$ echo ${a%%in*}
f
[xiangyu@localhost ~]$ echo ${a%in*}
find
好了,为了让这个字符串截取完整些,把另外些方法也一并贴出来吧!
一、Linux shell 截取字符变量的前8位,有方法如下:
1.expr substr “$a” 1 8
2.echo $a|awk ‘{print substr(,1,8)}’
3.echo $a|cut -c1-8
4.echo $
5.expr $a : ‘\(.\\).*’
6.echo $a|dd bs=1 count=8 2>/dev/null
二、按指定的字符串截取
上面带例子的是第一种方法。
还有一种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。
可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga
这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。
三、按照指定要求分割:
比如获取后缀名
ls -al | cut -d “.” -f2
http://www.bsdlover.cn/html/25/n-3225.html
我对shell中的精髓是awk不敢苟同,不过awk对字符串的处理很是蛮强大的。
平时做unix/linux管理的朋友对cat、grep等肯定不会陌生,但我要说,awk才是shell中的精髓所在。
我们可以把awk看作一个小的c语言的实现,awk的灵活多变黎补了shell的不足。
学习awk可以从“man awk”开始,但更高级的用法,可以参考网上的更详尽的文档。nawk是awk的兄弟,算是awk的一个高级实现,能实现更多的更高级(好用)的应用。
不会用awk,别说你已经懂了shell编程。
这里附录一下awk的常识:
1、awk程序体的一般格式为:
awk '
BEGIN{} #程序开始前的预处理部分可以对一些变量进行初始化
{} #对每条记录进行操作的主体部分
END{}' <文件名> #程序的结束部分,可以对处理的结果作一些善后或总结
2、awk的程序风格完全可以按照c语言的风格书写。例如:
awk '{
if ($1 == "FIND")
regex = $2;
else
{
where = match($0, regex);
if (where)
printf("Match of %s found at %d in %s",regex,where,$0);
}
}' <文件名>
当然,awk支持一些更简洁的书写风格,例如上面的printf语句可以写成:
print "Match of", regex, "found at", where, "in", $0
3、记录和字段的表示法。
整条记录表示为$0,第n个字段表示为$n
4、常用内在变量。
NR 是记录号,即当前正在处理第几条记录。
NF 是当前记录共有多少个字段,
这样,每条记录最后一个字段可表示为$NF,倒数第2个字段可表示为$(NF-1)
FS 是一个说明各个字段如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,类似于cut中的-d功能.
RS 是一个说明各个记录如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,例如,RS=":" 表示各条记录是用":"分开的.
OFS 定义各字段在输出时如何分隔开.
ORS 定义各条记录在输出时如何分隔开.
5、输出重定向。
例如:
awk '{ print $2 > "phone-list"
print $1 > "name-list" }' BBS-list
双引号内为文件名。
6、在awk中利用管道向shell命令传递参数。
例如:
awk '{ print $1 > "names.unsorted"
print $1 | "sort -r > names.sorted" }' BBS-list
7、awk的特有函数和其它功能请参阅awk手册。
另外,nawk比awk具有更多的功能,它能够把shell中的变量传递给nawk。
nawk格式:
Usage: nawk [-f programfile | 'program'] [-Ffieldstep] [-v var=value] [files]
例如,可以这样向nawk传递shell变量:
nawk -v dr=$HOME -v pk=`hostname` 'BEGIN{print dr pk}'
平时做unix/linux管理的朋友对cat、grep等肯定不会陌生,但我要说,awk才是shell中的精髓所在。
我们可以把awk看作一个小的c语言的实现,awk的灵活多变黎补了shell的不足。
学习awk可以从“man awk”开始,但更高级的用法,可以参考网上的更详尽的文档。nawk是awk的兄弟,算是awk的一个高级实现,能实现更多的更高级(好用)的应用。
不会用awk,别说你已经懂了shell编程。
这里附录一下awk的常识:
1、awk程序体的一般格式为:
awk '
BEGIN{} #程序开始前的预处理部分可以对一些变量进行初始化
{} #对每条记录进行操作的主体部分
END{}' <文件名> #程序的结束部分,可以对处理的结果作一些善后或总结
2、awk的程序风格完全可以按照c语言的风格书写。例如:
awk '{
if ($1 == "FIND")
regex = $2;
else
{
where = match($0, regex);
if (where)
printf("Match of %s found at %d in %s",regex,where,$0);
}
}' <文件名>
当然,awk支持一些更简洁的书写风格,例如上面的printf语句可以写成:
print "Match of", regex, "found at", where, "in", $0
3、记录和字段的表示法。
整条记录表示为$0,第n个字段表示为$n
4、常用内在变量。
NR 是记录号,即当前正在处理第几条记录。
NF 是当前记录共有多少个字段,
这样,每条记录最后一个字段可表示为$NF,倒数第2个字段可表示为$(NF-1)
FS 是一个说明各个字段如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,类似于cut中的-d功能.
RS 是一个说明各个记录如何分隔开的预定义变量.
这经常用于BEGIN语句体中预定义,例如,RS=":" 表示各条记录是用":"分开的.
OFS 定义各字段在输出时如何分隔开.
ORS 定义各条记录在输出时如何分隔开.
5、输出重定向。
例如:
awk '{ print $2 > "phone-list"
print $1 > "name-list" }' BBS-list
双引号内为文件名。
6、在awk中利用管道向shell命令传递参数。
例如:
awk '{ print $1 > "names.unsorted"
print $1 | "sort -r > names.sorted" }' BBS-list
7、awk的特有函数和其它功能请参阅awk手册。
另外,nawk比awk具有更多的功能,它能够把shell中的变量传递给nawk。
nawk格式:
Usage: nawk [-f programfile | 'program'] [-Ffieldstep] [-v var=value] [files]
例如,可以这样向nawk传递shell变量:
nawk -v dr=$HOME -v pk=`hostname` 'BEGIN{print dr pk}'
#!/bin/sh
var=$(awk '{print $1}' tmp.txt)
echo $var
注意:var= 后面没有空格;
-----------------------------------------
awk使用shell变量
1."'$var'"
#!/bin/bash
var="test"
awk 'BEGIN{print "'$var'"}'
这种写法要求变量var中不含有空格。若var中含有空格,那么就要用"'"$var"'"
2.export变量,然后用ENVIRON[“var”]
#!/bin/bash
var="test"
export var
awk 'BEGIN{print ENVIRON["var"]}'
3.使用-v选项。
#!/bin/bash
var="test"
awk -v nvar="$var" 'BEGIN{print nvar}'
shell使用awk传递出来的变量 --eval
$ cat awktest.sh
#!/bin/bash
var1="test"
var2="along"
eval $(awk 'BEGIN{print "var1=along;var2=test"}')
echo "var1:"$var1
echo "var2:"$var2
$ ./awktest.sh
var1:along
var2:test
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shuinieh/archive/2009/10/10/4649723.aspx
var=$(awk '{print $1}' tmp.txt)
echo $var
注意:var= 后面没有空格;
-----------------------------------------
awk使用shell变量
1."'$var'"
#!/bin/bash
var="test"
awk 'BEGIN{print "'$var'"}'
这种写法要求变量var中不含有空格。若var中含有空格,那么就要用"'"$var"'"
2.export变量,然后用ENVIRON[“var”]
#!/bin/bash
var="test"
export var
awk 'BEGIN{print ENVIRON["var"]}'
3.使用-v选项。
#!/bin/bash
var="test"
awk -v nvar="$var" 'BEGIN{print nvar}'
shell使用awk传递出来的变量 --eval
$ cat awktest.sh
#!/bin/bash
var1="test"
var2="along"
eval $(awk 'BEGIN{print "var1=along;var2=test"}')
echo "var1:"$var1
echo "var2:"$var2
$ ./awktest.sh
var1:along
var2:test
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shuinieh/archive/2009/10/10/4649723.aspx
武功再高,也怕菜刀
——解析武学衰落之路
遍观整个金庸武侠世界,可以说是一代不如一代,从北宋天龙那个群星闪耀,到韦爵爷宝衣匕首横行天下,这中间究竟发生了什么?
要解决这个问题,首先要回答另一个问题为什么要学武。或者说,武功有什么用?大致说来,武学拥有两个功能:第一强身健体;第二克敌制胜。有人或者会说,这种划分不正确。因为强身健体,自然就能克敌制胜,克敌制胜的同时也能强身健体。这是一而二,二而一的问题。本来也是这样,但从一代剑魔独孤求败的出现,这两个目的开始分化,并最终导致了整个武学的衰落。
大家知道,独孤求败有四柄长剑,两位传人。同为独孤传人的杨过和令狐冲,他们的剑法为什么会差别这么大。一个是“重剑无锋,大巧不工”,拿把几十斤的重剑砸过来砸过去,以浑厚的内力取胜;另一个却没有半点内力,有剑在手便纵横驰骋,没剑了便是废物一个。一个极度依赖内力,一个用一把剑就可以弥补内力的不足。我只能说杨过学的是第三把剑重剑,令狐冲学的是第四把剑木剑。
“四十岁后,不滞于物,草木竹石均可为剑自此精修,渐进於无剑胜有剑之境”这句话是什么意思。窃以为: “无剑胜有剑”说的是实事求是,具体问题具体分析。而“不滞于物,草木竹石均可为剑”是说“黑猫白猫,捉住老鼠就是好猫”。只要你能打败对方,不论你用什么,木头石头都是可以的,正所谓,“不滞于物”。而不是要求你把内力炼到飞花摘叶都可伤人的地步。这才是独孤求败的最高剑法——把你手中的东西捅进对方的身体,其他的东西你就不用管了。就这样,一代剑魔独孤求败把武学带进了魔道。
独孤求败用自己毕生的智慧揭示一个深刻无比的道理:武功再高,也怕菜刀。说到截金断玉,十年内功不如买把好刀。内力高有什么用,任我行抽再多的内力,也摸不到东方不败半点裙子。如果你能摸到,用内力劈还不如拿菜刀砍。与其花费毕生精力修习内力,不如把工夫花在琢磨怎么把菜刀砍在别人身上。
伟大的独孤求败天才地揭示了武学中的菜刀定理,伟大的令狐冲天才地实践了这一理念。在两位先哲的指导下,越来越多的大侠小侠们在追求武学的实用性上越走越远。于是韦小宝对陈近南的内功不屑一顾,拿着匕首石灰蒙汗药横行江湖。武学也一步步走向衰落。
[ 转自铁血社区 http://bbs.tiexue.net/ ]
杀死一个人,最好的方法是什么?用手枪。——火器来了,武学走了。在中华大地武学一步步走向衰落的时候,在西方却有一种运动的兴起,奥林匹克。因为它们追求的是第一种目的强身健体,而中华武学却被那个疯子带入了魔道。
——解析武学衰落之路
遍观整个金庸武侠世界,可以说是一代不如一代,从北宋天龙那个群星闪耀,到韦爵爷宝衣匕首横行天下,这中间究竟发生了什么?
要解决这个问题,首先要回答另一个问题为什么要学武。或者说,武功有什么用?大致说来,武学拥有两个功能:第一强身健体;第二克敌制胜。有人或者会说,这种划分不正确。因为强身健体,自然就能克敌制胜,克敌制胜的同时也能强身健体。这是一而二,二而一的问题。本来也是这样,但从一代剑魔独孤求败的出现,这两个目的开始分化,并最终导致了整个武学的衰落。
大家知道,独孤求败有四柄长剑,两位传人。同为独孤传人的杨过和令狐冲,他们的剑法为什么会差别这么大。一个是“重剑无锋,大巧不工”,拿把几十斤的重剑砸过来砸过去,以浑厚的内力取胜;另一个却没有半点内力,有剑在手便纵横驰骋,没剑了便是废物一个。一个极度依赖内力,一个用一把剑就可以弥补内力的不足。我只能说杨过学的是第三把剑重剑,令狐冲学的是第四把剑木剑。
“四十岁后,不滞于物,草木竹石均可为剑自此精修,渐进於无剑胜有剑之境”这句话是什么意思。窃以为: “无剑胜有剑”说的是实事求是,具体问题具体分析。而“不滞于物,草木竹石均可为剑”是说“黑猫白猫,捉住老鼠就是好猫”。只要你能打败对方,不论你用什么,木头石头都是可以的,正所谓,“不滞于物”。而不是要求你把内力炼到飞花摘叶都可伤人的地步。这才是独孤求败的最高剑法——把你手中的东西捅进对方的身体,其他的东西你就不用管了。就这样,一代剑魔独孤求败把武学带进了魔道。
独孤求败用自己毕生的智慧揭示一个深刻无比的道理:武功再高,也怕菜刀。说到截金断玉,十年内功不如买把好刀。内力高有什么用,任我行抽再多的内力,也摸不到东方不败半点裙子。如果你能摸到,用内力劈还不如拿菜刀砍。与其花费毕生精力修习内力,不如把工夫花在琢磨怎么把菜刀砍在别人身上。
伟大的独孤求败天才地揭示了武学中的菜刀定理,伟大的令狐冲天才地实践了这一理念。在两位先哲的指导下,越来越多的大侠小侠们在追求武学的实用性上越走越远。于是韦小宝对陈近南的内功不屑一顾,拿着匕首石灰蒙汗药横行江湖。武学也一步步走向衰落。
[ 转自铁血社区 http://bbs.tiexue.net/ ]
杀死一个人,最好的方法是什么?用手枪。——火器来了,武学走了。在中华大地武学一步步走向衰落的时候,在西方却有一种运动的兴起,奥林匹克。因为它们追求的是第一种目的强身健体,而中华武学却被那个疯子带入了魔道。
Shell是每一个UNIX系统都有的工具,他功能强大,有很多系统启动程序是用Shell来写的.
在这里,我们利用Shell程序来操作MySQL数据库.
约定: MySQL管理用户为root, 密码为secret.
# vi mysql_opt.sh
#!/bin/sh
#
# 调用方法: mysql_opt $db_name "SQL语句"
这样,就能通过调用mysql_opt函数来对MySQL数据库进行操作.
例: 要查找数据库test_db中test_table表的所有数据
如果需要导出mysql的记录到文本文件:
我知道的有如下两种方式可以在shell中访问操作mysql数据库
1. mysql -uusername -ppasswd -e "command;command"
对mysql偶尔有用的另一个选项是-e或--execute选项,可用来将SQL语句传递给服务器。该语句必须
用引号引起来(单引号或双引号)。(然而,如果想要在查询中将值引起来,则对于查询应使用双引号
,查询中引用的值应使用单引号)。当使用该选项时,语句被执行,然后mysql立即退出命令外壳。
例如,你可以用下面的命令获得用户账户列表:
shell> mysql -u root -p -e "SELECT User, Host FROM User" mysql
请注意mysql数据库名作为一个独立的参量传递。然而,相同的查询可能已经使用mysql -u root -p
-e "SELECT User,Host FROM mysql.User"从外壳中执行。
可以按这种方式传递多个SQL语句,用分号隔开:
2. 如果sql语句比较多,可使用如下方式:
从查询结果中可以看出,两者的输出结果格式不一样,前一种方式保留了mysql的输出格式。
另外,与此篇文章有关的shell 重定向知识,可以查阅ABS guide第16章节“I/O重定向”和第17章节“Here Documents”
重定向示意:
自动登录mysql(root:root,passwd:123456),查询test库,test1表里的user=aa的记录.
#!/bin/sh
mysql -uroot -p123456 < use test;
select * from testaa while a=10000; ###1000 not usr single quote mark,because a is int type,only char type need single quote mark.
EOF
在这里,我们利用Shell程序来操作MySQL数据库.
约定: MySQL管理用户为root, 密码为secret.
# vi mysql_opt.sh
#!/bin/sh
#
# 调用方法: mysql_opt $db_name "SQL语句"
sql_user=root
sql_pass=secret
sql_opt="-u$sql_user -p$sql_pass -s"
mysql_opt() {
db_name=$1
sql_lan=$2
mysql $sql_opt << EOF
USE $db_name;
$sql_lan;
QUIT
EOF
}
#
# The file mysql_opt.sh ends here!
sql_pass=secret
sql_opt="-u$sql_user -p$sql_pass -s"
mysql_opt() {
db_name=$1
sql_lan=$2
mysql $sql_opt << EOF
USE $db_name;
$sql_lan;
QUIT
EOF
}
#
# The file mysql_opt.sh ends here!
这样,就能通过调用mysql_opt函数来对MySQL数据库进行操作.
例: 要查找数据库test_db中test_table表的所有数据
# vi select.sh
#!/bin/sh
#
. ./mysql_opt.sh
echo "Query..."
data=`mysql_opt test_db "SELECT * FROM test_table WHERE 1"`
echo $data
echo "Done!"
#
# The file select.sh ends here!
[root@kevin bin]# ./mysql -u root -p111111 -e "use mysql;select host,user,password from user";
+-----------+------+-------------------------------------------+
| host | user | password |
+-----------+------+-------------------------------------------+
| localhost | root | *FD571203974BA9AFE270FE62151AE967ECA5E0AA |
| kevin.com | root | |
| 127.0.0.1 | root | |
| localhost | | |
| kevin.com | | |
+-----------+------+-------------------------------------------+
****************************************
#!/bin/bash
/usr/local/mysql-5.1.32/bin/mysql -u root -p111111 -e "use mysql;select host,user,password from user";
exit 0;
****************************************
#!/bin/sh
#
. ./mysql_opt.sh
echo "Query..."
data=`mysql_opt test_db "SELECT * FROM test_table WHERE 1"`
echo $data
echo "Done!"
#
# The file select.sh ends here!
[root@kevin bin]# ./mysql -u root -p111111 -e "use mysql;select host,user,password from user";
+-----------+------+-------------------------------------------+
| host | user | password |
+-----------+------+-------------------------------------------+
| localhost | root | *FD571203974BA9AFE270FE62151AE967ECA5E0AA |
| kevin.com | root | |
| 127.0.0.1 | root | |
| localhost | | |
| kevin.com | | |
+-----------+------+-------------------------------------------+
****************************************
#!/bin/bash
/usr/local/mysql-5.1.32/bin/mysql -u root -p111111 -e "use mysql;select host,user,password from user";
exit 0;
****************************************
如果需要导出mysql的记录到文本文件:
/usr/local/mysql-5.1.32/bin/mysql -u root -p111111 -e "use mysql;select host,user,password from user into outfile '/home/mysql/aa.txt';"
mysql -u $user -p$password -e "create database test;"
mysql -u $user -p$password -e "create database test;"
我知道的有如下两种方式可以在shell中访问操作mysql数据库
1. mysql -uusername -ppasswd -e "command;command"
[root@localhost ~]# mysql -uroot -p123456 -e "select user,host from mysql.user"
+------+-----------------------+
| user | host |
+------+-----------------------+
| root | % |
| root | 127.0.0.1 |
| php | localhost |
| root | localhost |
| root | localhost.localdomain |
+------+-----------------------+
请看下面这段文字:(引自mysql参考手册)+------+-----------------------+
| user | host |
+------+-----------------------+
| root | % |
| root | 127.0.0.1 |
| php | localhost |
| root | localhost |
| root | localhost.localdomain |
+------+-----------------------+
对mysql偶尔有用的另一个选项是-e或--execute选项,可用来将SQL语句传递给服务器。该语句必须
用引号引起来(单引号或双引号)。(然而,如果想要在查询中将值引起来,则对于查询应使用双引号
,查询中引用的值应使用单引号)。当使用该选项时,语句被执行,然后mysql立即退出命令外壳。
例如,你可以用下面的命令获得用户账户列表:
shell> mysql -u root -p -e "SELECT User, Host FROM User" mysql
请注意mysql数据库名作为一个独立的参量传递。然而,相同的查询可能已经使用mysql -u root -p
-e "SELECT User,Host FROM mysql.User"从外壳中执行。
可以按这种方式传递多个SQL语句,用分号隔开:
shell> mysql -u root -p --execute="SELECT Name FROM Country WHERE Name LIKE
'AU%';SELECT COUNT(*) FROM City" world
'AU%';SELECT COUNT(*) FROM City" world
2. 如果sql语句比较多,可使用如下方式:
[root@localhost ~]# mysql -uroot -p123456 << EOF
> use mysql;
> select user,host from user;
> EOF
user host
root %
root 127.0.0.1
php localhost
root localhost
root localhost.localdomain
> use mysql;
> select user,host from user;
> EOF
user host
root %
root 127.0.0.1
php localhost
root localhost
root localhost.localdomain
从查询结果中可以看出,两者的输出结果格式不一样,前一种方式保留了mysql的输出格式。
另外,与此篇文章有关的shell 重定向知识,可以查阅ABS guide第16章节“I/O重定向”和第17章节“Here Documents”
重定向示意:
mysql -uroot -p123qwe <"/opt/sqlinfo.sql" >"a.txt"
自动登录mysql(root:root,passwd:123456),查询test库,test1表里的user=aa的记录.
#!/bin/sh
mysql -uroot -p123456 <
select * from testaa while a=10000; ###1000 not usr single quote mark,because a is int type,only char type need single quote mark.
EOF
cat /tmp/765469051.txt |grep 2009-12-06|awk '{print $2 " " $3}'|grep 5|wc
使用 pq magic 8.0分区出现 Error 983 报错信息的处理办法
解决方法:
1.确保登陆的用户为 Administrator,并且 Administrator 的缺省权限没有修改过。
2.执行 chkdsk /f 命令确认硬盘磁道及其文件和分区注册表没有问题
3.请关闭 norton 的自动保护功能和其他有系统保护功能的程序。
4.执行 pqmagic 8.0 进行分区工作。
另外,如果是ntfs分区格式的硬盘,请取消其对属性的改动。例如:取消压缩和设置密码。 这些都会导致操作的失败。
多数情况下只要在运行chkdsk /f 即可解决。
解决方法:
1.确保登陆的用户为 Administrator,并且 Administrator 的缺省权限没有修改过。
2.执行 chkdsk /f 命令确认硬盘磁道及其文件和分区注册表没有问题
3.请关闭 norton 的自动保护功能和其他有系统保护功能的程序。
4.执行 pqmagic 8.0 进行分区工作。
另外,如果是ntfs分区格式的硬盘,请取消其对属性的改动。例如:取消压缩和设置密码。 这些都会导致操作的失败。
多数情况下只要在运行chkdsk /f 即可解决。
sysfader:iexplore.exe-应用程序错误的解决方法
起因
每一次写blog就报这个错误……好打击积极性……还好有解决办法……
现象:
在运行iexplore.exe浏览网页的时候,有时会弹出错误提示框,一点确定就把IE关闭了。这由于设置了网页的指定颜色导致的。
错误信息提示如下:
错误:“0x029b6c3d”指令引用的“0x00000000”内存。该内存不能 为“read”。
sysfader.exe是附属于Nvidia显卡驱动程序的,用于处理桌面的淡入/淡出效果,以及气球提示条,在通常情况是不会出现在进程中并引起错误的。
解决
第一步:
注册所有的Dll,具体方法是:
点击:开始-->运行,在运行框中输入cmd,在命令提示符下输入:
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
第二步:
请右键单击"我的电脑",点击"属性"-->"高级",在"性能"一栏中,将所有特殊效果取消。即调整为最佳性能。
(然后在转为最佳视觉看看还会不会出错……不然windows太难看了……)
起因
每一次写blog就报这个错误……好打击积极性……还好有解决办法……
现象:
在运行iexplore.exe浏览网页的时候,有时会弹出错误提示框,一点确定就把IE关闭了。这由于设置了网页的指定颜色导致的。
错误信息提示如下:
错误:“0x029b6c3d”指令引用的“0x00000000”内存。该内存不能 为“read”。
sysfader.exe是附属于Nvidia显卡驱动程序的,用于处理桌面的淡入/淡出效果,以及气球提示条,在通常情况是不会出现在进程中并引起错误的。
解决
第一步:
注册所有的Dll,具体方法是:
点击:开始-->运行,在运行框中输入cmd,在命令提示符下输入:
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
第二步:
请右键单击"我的电脑",点击"属性"-->"高级",在"性能"一栏中,将所有特殊效果取消。即调整为最佳性能。
(然后在转为最佳视觉看看还会不会出错……不然windows太难看了……)
把本地连接属性里面的TCP/IP协议属性对话框打开,然后选手动配置IP,随便填入192.168.0.1之类的IP,子网掩码输入255.255.255.0,点确定即可。
出现提示的原因是:
SP2更多考虑了安全问题,你的IP设置为自动获取,其实是从DHCP服务器获取IP及相关参数,但是这个过程可能由于某种原因,没有完成.在SP1时代,这种情况下,操作系统为了防止脱网(微软这么写的),自作主张为网卡设置169.x.x.x的保留IP,不作任何错误提示,如果有多台计算机没有获得正确的IP,那么他们通过保留地址还可以互相通讯。但是安装SP2后,操作系统依据“安全”至上的原则,不分配任何IP,切断网络连接,并报告错误“本地连接受限制或无连接”。
脑上的本地连接显示受限制或无连接是跟网络服务器和网卡有关的。反正属于网络方面的问题,跟计算机没多大关系,不影响系统,可以不用管他的。如果实在烦,可以在“网络连接“的”本地连接“的设置里把”无连接时通知我“的选项去掉.不影响上网
内网的话指定一个IP就好啦........
http://www.cisco.com/web/CN/products/products_netsol/wireless/pdf/wireless_cg_6.pdf
出现提示的原因是:
SP2更多考虑了安全问题,你的IP设置为自动获取,其实是从DHCP服务器获取IP及相关参数,但是这个过程可能由于某种原因,没有完成.在SP1时代,这种情况下,操作系统为了防止脱网(微软这么写的),自作主张为网卡设置169.x.x.x的保留IP,不作任何错误提示,如果有多台计算机没有获得正确的IP,那么他们通过保留地址还可以互相通讯。但是安装SP2后,操作系统依据“安全”至上的原则,不分配任何IP,切断网络连接,并报告错误“本地连接受限制或无连接”。
脑上的本地连接显示受限制或无连接是跟网络服务器和网卡有关的。反正属于网络方面的问题,跟计算机没多大关系,不影响系统,可以不用管他的。如果实在烦,可以在“网络连接“的”本地连接“的设置里把”无连接时通知我“的选项去掉.不影响上网
内网的话指定一个IP就好啦........
http://www.cisco.com/web/CN/products/products_netsol/wireless/pdf/wireless_cg_6.pdf
台式机,安装Windows XP SP2,使用PCI 54M无线网卡,连接无线路由器。
阅读全文

struts就相当于业务层,一般是用来控制跳转,hibernate是提供数据的,也就是数据持久层,与数据库打交道的那一层,spring是对hibernate的更深次包装,他是一个大型的平台既包含struts也包含hibernate更包其他的框架,
1 Struts
虽然不打算过多介绍Struts的原理,但是大概介绍一下还是有必要的。Struts本身就是 MVC 在这里负责将用户数据传人业务层,以及 将业务层处理的结果返回给用户,此系统属于较简单WEB应用,采用了OpenSessionInView模式处理LazyLoad问题,这样我们可以在用户视图中使用 get,set方法来方便地获取关联对象。为了处理庞大的Action和ActionForm问题,在此我门准备使用DynaActionForm (DynaValidatorForm)和DispatchAction以及 动态验证框架 来解决。及使用Tile来解决框架问题 。使用自定义标签处理分页和身份验证问题。
2 Spring
Spring Framework最得以出名的是与Hibernate的无缝链接,虽然Spring 对Hibernate提供了90%以上的封装,使我们不必去关心Session 的建立,关闭,以及事务使我们能够专心的关注业务逻辑。但是一些特殊情况如 有时需要Query以及Criteria 对象,分页等,Spring不能给我们提供支持,总不能每次都在你的DAO上写个HibernateCallBackup()吧?Spring的作用不是把Hibernate再封装一层,而是让你接触不到Hibernate的API,而是帮助你管理好Session和Transaction。
在这里解决方法是:首先 写一个IBase 的接口,和一个BaseDao的实现。在实现中仿照HibernateTemplate,将其功能一一实现,同时考虑到Spring 未能支持的地方,我们不得已只好自己来管理Session,因此加入public Session openSession(),public Query getQuery(String sql),public Criteria getCriteria(Class clazz),以及分页的方法。 然后为每一个Entity 都建立继承于以上类的IEntity,与EntityDao。这里可以根据需求对Entity加入特殊的方法实现,如 在 StudentsDao.java 中加入类似用户身份验证等。以上就是数据访问层。接下来在Service层中通过对dao的引用完成业务逻辑方法。在下面的例子中我们分别为学生模块,教师模块,管理员模块构建Service层,StudentsServiceImpl,TeachersServiceImpl,AdminServiceImpl。
3 Hibernate
有了Spring的封装,我们要对Hibernate做的就是正确实现对象关系的映射。由于此处处于系统的最底层,准确无误的实现对象之间的关联关系映射将起着至关重要的作用。
总之,理解了Struts,Spring,Hibernate地原理以及之间的关系之后,剩下的工作就如同在以Spring为核心的Struts为表现的框架中堆积木。
最后:
框架只是幫助你快速開發的。好的軟件公司更注重你在j2se、數據結構、算法設計、設計模式、操作系統、計算機組成原理、計算機網絡等方面的素質。如果以上這些方面的基礎都穩固了,你就已經比那些只會框架的“軟件民工”值錢了。那個時候,別說學框架了,自己已經能開始寫框架了。
Add Time:(2014-09-15)
兄弟,struct hibernate spring 这三层你们都用上了?
只用 spring
1 Struts
虽然不打算过多介绍Struts的原理,但是大概介绍一下还是有必要的。Struts本身就是 MVC 在这里负责将用户数据传人业务层,以及 将业务层处理的结果返回给用户,此系统属于较简单WEB应用,采用了OpenSessionInView模式处理LazyLoad问题,这样我们可以在用户视图中使用 get,set方法来方便地获取关联对象。为了处理庞大的Action和ActionForm问题,在此我门准备使用DynaActionForm (DynaValidatorForm)和DispatchAction以及 动态验证框架 来解决。及使用Tile来解决框架问题 。使用自定义标签处理分页和身份验证问题。
2 Spring
Spring Framework最得以出名的是与Hibernate的无缝链接,虽然Spring 对Hibernate提供了90%以上的封装,使我们不必去关心Session 的建立,关闭,以及事务使我们能够专心的关注业务逻辑。但是一些特殊情况如 有时需要Query以及Criteria 对象,分页等,Spring不能给我们提供支持,总不能每次都在你的DAO上写个HibernateCallBackup()吧?Spring的作用不是把Hibernate再封装一层,而是让你接触不到Hibernate的API,而是帮助你管理好Session和Transaction。
在这里解决方法是:首先 写一个IBase 的接口,和一个BaseDao的实现。在实现中仿照HibernateTemplate,将其功能一一实现,同时考虑到Spring 未能支持的地方,我们不得已只好自己来管理Session,因此加入public Session openSession(),public Query getQuery(String sql),public Criteria getCriteria(Class clazz),以及分页的方法。 然后为每一个Entity 都建立继承于以上类的IEntity,与EntityDao。这里可以根据需求对Entity加入特殊的方法实现,如 在 StudentsDao.java 中加入类似用户身份验证等。以上就是数据访问层。接下来在Service层中通过对dao的引用完成业务逻辑方法。在下面的例子中我们分别为学生模块,教师模块,管理员模块构建Service层,StudentsServiceImpl,TeachersServiceImpl,AdminServiceImpl。
3 Hibernate
有了Spring的封装,我们要对Hibernate做的就是正确实现对象关系的映射。由于此处处于系统的最底层,准确无误的实现对象之间的关联关系映射将起着至关重要的作用。
总之,理解了Struts,Spring,Hibernate地原理以及之间的关系之后,剩下的工作就如同在以Spring为核心的Struts为表现的框架中堆积木。
最后:
框架只是幫助你快速開發的。好的軟件公司更注重你在j2se、數據結構、算法設計、設計模式、操作系統、計算機組成原理、計算機網絡等方面的素質。如果以上這些方面的基礎都穩固了,你就已經比那些只會框架的“軟件民工”值錢了。那個時候,別說學框架了,自己已經能開始寫框架了。
Add Time:(2014-09-15)
兄弟,struct hibernate spring 这三层你们都用上了?
只用 spring
每次都要去chmod -R * ;chown -R nobody.nogroup * 很是麻烦,写一脚本解决,到时候直接调用一下secureCRT的脚本--》运行--》选择脚本即可!
代码如下:
【前言】
SecureCRT是一款非常流行和受欢迎的远程登录和终端仿真软件,支持Telnet,SSH等。
它还可以支持VBScript和JScript,通过Script的支持,SecureCRT能够自动完成我们设定
好的各种任务。
阅读全文
代码如下:
Sub Main
crt.Screen.Synchronous = True
crt.Screen.Send "chmod -R 755 *" & vbcr
crt.Screen.Send "chown -R nobody.nogroup *" & vbcr
crt.Screen.Send " "
crt.Screen.Synchronous = False
End Sub
crt.Screen.Synchronous = True
crt.Screen.Send "chmod -R 755 *" & vbcr
crt.Screen.Send "chown -R nobody.nogroup *" & vbcr
crt.Screen.Send " "
crt.Screen.Synchronous = False
End Sub
【前言】
SecureCRT是一款非常流行和受欢迎的远程登录和终端仿真软件,支持Telnet,SSH等。
它还可以支持VBScript和JScript,通过Script的支持,SecureCRT能够自动完成我们设定
好的各种任务。
