BSD 和 SYSV 是世上最正统的 UNIX 操作系统,在 LINUX 出现之前,他们统治了整个 UNIX 世界。也正因为此,这两个最正统的 UNIX 核心流派都在实践中积累丰富的经验。
SYSV 偏向于商业,BSD 更偏向于自由和实用。
现 在,本文只讨论 BSD 流派最活跃的发行版 FreeBSD。FreeBSD 作为最重要的一个 BSD 发行版,它保持了 BSD 自由和实用的原则。但亦因为此而忽略很多商业的考虑的相应的功能。凭藉我自己多年 UNIX 的使用经验,列出一些 BSD 的优势与不足,希望以此作为读者的参考。
不足之处:
文件系统:
FreeBSD 的文件系统属于中上水平,但未达至企业级的应用需求。主要体现于文件系统本身存在的脆弱性。在高负载的情况下,文件系统存在有崩溃的可能性。需要注意的 是,导致这样的结果,也有可能由于磁盘控制器(SCSI, RAID 等等)驱动程序本身导致的。没有原厂设备驱动程序是个比较大的问题。
网络:
FreeBSD 的网络性能是无用置疑的!但是网卡驱动(是的,设备驱动是个很重要的因素)不完善会导致性能和稳定性大打节扣。虽然这与 FreeBSD 的核心没有关系,但对于一个可提供服务的整体来说,驱动程序却是一个很重要的组成部份。
另外,由于一个网卡接口上的线的松动,有可能导致网络中断。而一些商业化的 UNIX 操作系统可以在当主网卡不可用时将该网卡上的 IP 转移至可提供正确连接的网卡上。
多处理器(超线程)支持:
在 6.0 出版之前,FreeBSD 对多处理器支持是不尽人意的。INTEL CPU 提供有 HT(超线程)功能。FreeBSD 在 HT 开启的状态下会比在关闭的状态下差。我忘记了超线程的原理,只记得拥有超线程功能的 CPU 在过多的切换情况下性能就会降低,不过在什么时候切换和切换些什么我忘记了。FreeBSD 在开启 HT 后性能会变差,可能与这个有关。
出众之处:
网络:
FreeBSD 的网络性能非常好,可以同时处理海量的网络请求,这使 BSD 非常适合作为防火墙的环境。另外,在网络聊天服务器,如 IM 这种应用上,FreeBSD 也是很合适的选择。网易的 POPO 聊天软件服务器端就是在 FreeBSD 下开发并投入到实际环境中使用的,通过对内核的修改,可以轻松支持数以万计的用户连接,要注意,是永久性的连接,除非用户点击注销按钮。
内存:
你 会发现你服务器上的内存会被 FreeBSD 很好地利用,以使你的服务达至最佳的状态。FreeBSD 不会因为将过多的内存用于磁盘 CACHE 而使更重要的程序获取不到物理内存而让系统使用 SWAP。在实际的环境中,我就遇到过 LINUX 为保持磁盘的 CACHE,而让新任务使用 SWAP,导致新任务执行时间大大拉长。在执行 swapoff -a 操作后,运行同样的新任务只需要原来时间的一半。而系统并没有因为关闭 SWAP 而停机,表示物理内存并没有因为新任务而被耗尽。
一个例子:
Memcached 是一个非常出众的基于内存的缓存服务器。它可以为被其支持的程序语言提供串行化数据保存的功能,这样可以让同一份数据被多台服务器共享,而更重要的是,它的速度非常快。
我 可以利用 PHP 或 JAVA 从数据库中获取数据结果集,然后将结果集的内容保存进 Memcached,其他服务器上的程序同样可以相应的 key 从 Memcached 中获得相同的拷贝。在分布式的环境,这种需求非常明显。我自己也尝试当 SESSION 数据保存至 Memcached 而无需为共享 SESSION 数据而专门架设一台 MYSQL 数据库。
在利用 Memcached 作为数据的中心点,网络的流量会非常大,内存的使用会非常频繁,基本上不与磁盘打交道,而且整个系统的稳健性要求非常高。在这种应用需求下,FreeBSD 自然地成为首选。因为它为高效的网络性能,更合理的内存利用率,和稳健的系统基础。
一挥受到此文的影响故而最终决定在FreeBSD上装Memcached和图片服务器!
原文请见《FreeBSD是什么?FreeBSD的优缺点分析》
SYSV 偏向于商业,BSD 更偏向于自由和实用。
现 在,本文只讨论 BSD 流派最活跃的发行版 FreeBSD。FreeBSD 作为最重要的一个 BSD 发行版,它保持了 BSD 自由和实用的原则。但亦因为此而忽略很多商业的考虑的相应的功能。凭藉我自己多年 UNIX 的使用经验,列出一些 BSD 的优势与不足,希望以此作为读者的参考。
不足之处:
文件系统:
FreeBSD 的文件系统属于中上水平,但未达至企业级的应用需求。主要体现于文件系统本身存在的脆弱性。在高负载的情况下,文件系统存在有崩溃的可能性。需要注意的 是,导致这样的结果,也有可能由于磁盘控制器(SCSI, RAID 等等)驱动程序本身导致的。没有原厂设备驱动程序是个比较大的问题。
网络:
FreeBSD 的网络性能是无用置疑的!但是网卡驱动(是的,设备驱动是个很重要的因素)不完善会导致性能和稳定性大打节扣。虽然这与 FreeBSD 的核心没有关系,但对于一个可提供服务的整体来说,驱动程序却是一个很重要的组成部份。
另外,由于一个网卡接口上的线的松动,有可能导致网络中断。而一些商业化的 UNIX 操作系统可以在当主网卡不可用时将该网卡上的 IP 转移至可提供正确连接的网卡上。
多处理器(超线程)支持:
在 6.0 出版之前,FreeBSD 对多处理器支持是不尽人意的。INTEL CPU 提供有 HT(超线程)功能。FreeBSD 在 HT 开启的状态下会比在关闭的状态下差。我忘记了超线程的原理,只记得拥有超线程功能的 CPU 在过多的切换情况下性能就会降低,不过在什么时候切换和切换些什么我忘记了。FreeBSD 在开启 HT 后性能会变差,可能与这个有关。
出众之处:
网络:
FreeBSD 的网络性能非常好,可以同时处理海量的网络请求,这使 BSD 非常适合作为防火墙的环境。另外,在网络聊天服务器,如 IM 这种应用上,FreeBSD 也是很合适的选择。网易的 POPO 聊天软件服务器端就是在 FreeBSD 下开发并投入到实际环境中使用的,通过对内核的修改,可以轻松支持数以万计的用户连接,要注意,是永久性的连接,除非用户点击注销按钮。
内存:
你 会发现你服务器上的内存会被 FreeBSD 很好地利用,以使你的服务达至最佳的状态。FreeBSD 不会因为将过多的内存用于磁盘 CACHE 而使更重要的程序获取不到物理内存而让系统使用 SWAP。在实际的环境中,我就遇到过 LINUX 为保持磁盘的 CACHE,而让新任务使用 SWAP,导致新任务执行时间大大拉长。在执行 swapoff -a 操作后,运行同样的新任务只需要原来时间的一半。而系统并没有因为关闭 SWAP 而停机,表示物理内存并没有因为新任务而被耗尽。
一个例子:
Memcached 是一个非常出众的基于内存的缓存服务器。它可以为被其支持的程序语言提供串行化数据保存的功能,这样可以让同一份数据被多台服务器共享,而更重要的是,它的速度非常快。
我 可以利用 PHP 或 JAVA 从数据库中获取数据结果集,然后将结果集的内容保存进 Memcached,其他服务器上的程序同样可以相应的 key 从 Memcached 中获得相同的拷贝。在分布式的环境,这种需求非常明显。我自己也尝试当 SESSION 数据保存至 Memcached 而无需为共享 SESSION 数据而专门架设一台 MYSQL 数据库。
在利用 Memcached 作为数据的中心点,网络的流量会非常大,内存的使用会非常频繁,基本上不与磁盘打交道,而且整个系统的稳健性要求非常高。在这种应用需求下,FreeBSD 自然地成为首选。因为它为高效的网络性能,更合理的内存利用率,和稳健的系统基础。
一挥受到此文的影响故而最终决定在FreeBSD上装Memcached和图片服务器!
原文请见《FreeBSD是什么?FreeBSD的优缺点分析》
Uptimes-Project.org统计了各种操作系统的连续运行时间的最高纪录以及平均值。我们看到目前这项纪录的保持者是由运行于Alpha主机之上的OpenVMS集群系统保持的,其最长连续运行时间为10年180天6小时40分钟,平均运行时间也有4年多。我们常用的Windows系统最高纪录为189天1小时59分钟,平均值为10天多;Linux的表现则为1年 309天(最高值)和接近20天(平均值)
Uptimes Project
Welcome to the uptimes project. This site uses open source software to track, report, and generate statistics based on user data.
We currently have collectively monitored over 10907 Years 98 Days 10 Hours 30 Minutes of uptime.
With more than 2371 hosts reporting.
Overall Statistics
Highest Uptime
NameWVNETcluster
DescriptionWVNET VMScluster with both ...
Uptime11 Years 303 Days 20 Hours 57 Minutes
Detailed Stats
Overall Project Stats
Total Uptime10907 Years 110 Days 6 Hours 18 Minutes
Total Hosts
2371
Active Hosts
134
Operating System Hosts Highest Uptime
BeOS 2 1 Hours 32 Minutes
Darwin 15 89 Days 12 Hours 40 Minutes
Embedded 67 1 Years 131 Days 2 Hours 27 Minutes
FreeBSD 93 5 Years 64 Days 17 Hours 37 Minutes
Linux 466 3 Years 331 Days 14 Hours 24 Minutes
Mac OS X 1 1 Days 2 Hours 43 Minutes
mIRC 1 18 Days 18 Hours 13 Minutes
NetBSD 9 3 Years 4 Days 23 Hours 5 Minutes
OpenBSD 18 2 Years 76 Days 4 Hours 39 Minutes
OpenVMS 15 1 Years 265 Days 8 Hours 42 Minutes
OpenVMSClust 4 13 Years 337 Days 19 Hours 16 Minutes
OpenVMSCluster 1 10 Years 5 Days 1 Hours 17 Minutes
OS/2 3 250 Days 7 Hours 50 Minutes
Unknown 1 49 Days 16 Hours 41 Minutes
Windows 779 272 Years 74 Days 12 Hours 28 Minutes
Uptimes Project
Welcome to the uptimes project. This site uses open source software to track, report, and generate statistics based on user data.
We currently have collectively monitored over 10907 Years 98 Days 10 Hours 30 Minutes of uptime.
With more than 2371 hosts reporting.
Overall Statistics
Highest Uptime
NameWVNETcluster
DescriptionWVNET VMScluster with both ...
Uptime11 Years 303 Days 20 Hours 57 Minutes
Detailed Stats
Overall Project Stats
Total Uptime10907 Years 110 Days 6 Hours 18 Minutes
Total Hosts
2371
Active Hosts
134
Operating System Hosts Highest Uptime
BeOS 2 1 Hours 32 Minutes
Darwin 15 89 Days 12 Hours 40 Minutes
Embedded 67 1 Years 131 Days 2 Hours 27 Minutes
FreeBSD 93 5 Years 64 Days 17 Hours 37 Minutes
Linux 466 3 Years 331 Days 14 Hours 24 Minutes
Mac OS X 1 1 Days 2 Hours 43 Minutes
mIRC 1 18 Days 18 Hours 13 Minutes
NetBSD 9 3 Years 4 Days 23 Hours 5 Minutes
OpenBSD 18 2 Years 76 Days 4 Hours 39 Minutes
OpenVMS 15 1 Years 265 Days 8 Hours 42 Minutes
OpenVMSClust 4 13 Years 337 Days 19 Hours 16 Minutes
OpenVMSCluster 1 10 Years 5 Days 1 Hours 17 Minutes
OS/2 3 250 Days 7 Hours 50 Minutes
Unknown 1 49 Days 16 Hours 41 Minutes
Windows 779 272 Years 74 Days 12 Hours 28 Minutes
跨域名设置cookie需要用到两个文件 分别在两个域名下
比如你现在有两个域名 www.a.com www.b.com
你现在想在b下设置cookie并通过在b下面设置a的cookie
你需要b下面的文件b.php
setcookie("test", ‘value’, time()+3600, "/", ".b.com");//建立b的cookie
<script src="http://www.a.com/seta.php?id=value"></script>//[/url]传递到a中
同时在a下面建立接收文件a.php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');//有些浏览器需要这句话
setcookie("test", $_GET['id'], time()+3600, "/", ".a.com"); //在a中设置cookie
为你能睡个好觉,呵呵!
以前真没在意cookie的作用域问题,可能以前用.com域名没出过问题,今天用公司的一个cn域名测试,怎么也不能实现cookie共享,后来采用 js设置cookie,在另外一台服务器上共享cookie成功,真叫气人!翻阅了一下php的cookie 规范 ,里面有这么一段
Only hosts within the specified domain can set a cookie for a domain and domains must have at least two (2) or three (3) periods in them to prevent domains of the form: ".com", ".edu", and "va.us". Any domain that fails within one of the seven special top level domains listed below only require two periods. Any other domain requires at least three. The seven special top level domains are: "COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT".
看出来了吧,真他娘的草蛋!除了"COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT"这几个后缀的域名可以设置二级作用域,其他的域名至少三级才可以,也就是说想通过设置作用域为b.cn来实现a.b.cn和c.b.cn下的 cookie共享用php是不行的,php只能实现作用域b.a.cn下的d.b.a.cn和e.b.a.cn间的cookie共享,希望大家注意,再遇到此类问题,别浪费时间拼命的测试了……
延伸阅读:http://www.ibiancheng.cn/Article/VBNetArticle/200711/67.html
比如你现在有两个域名 www.a.com www.b.com
你现在想在b下设置cookie并通过在b下面设置a的cookie
你需要b下面的文件b.php
setcookie("test", ‘value’, time()+3600, "/", ".b.com");//建立b的cookie
<script src="http://www.a.com/seta.php?id=value"></script>//[/url]传递到a中
同时在a下面建立接收文件a.php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');//有些浏览器需要这句话
setcookie("test", $_GET['id'], time()+3600, "/", ".a.com"); //在a中设置cookie
为你能睡个好觉,呵呵!
以前真没在意cookie的作用域问题,可能以前用.com域名没出过问题,今天用公司的一个cn域名测试,怎么也不能实现cookie共享,后来采用 js设置cookie,在另外一台服务器上共享cookie成功,真叫气人!翻阅了一下php的cookie 规范 ,里面有这么一段
Only hosts within the specified domain can set a cookie for a domain and domains must have at least two (2) or three (3) periods in them to prevent domains of the form: ".com", ".edu", and "va.us". Any domain that fails within one of the seven special top level domains listed below only require two periods. Any other domain requires at least three. The seven special top level domains are: "COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT".
看出来了吧,真他娘的草蛋!除了"COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT"这几个后缀的域名可以设置二级作用域,其他的域名至少三级才可以,也就是说想通过设置作用域为b.cn来实现a.b.cn和c.b.cn下的 cookie共享用php是不行的,php只能实现作用域b.a.cn下的d.b.a.cn和e.b.a.cn间的cookie共享,希望大家注意,再遇到此类问题,别浪费时间拼命的测试了……
延伸阅读:http://www.ibiancheng.cn/Article/VBNetArticle/200711/67.html
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
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