三、逻辑运算符: &&、||、! 结合性:!为自右向左,而&&和||为自左向右
优先级:!>&>|| 知识点:
1、逻辑表达式值为1或0.由于C编译系统在判断一个量以0为”假”,以非0为”真” 1、复合运算符左边必须是变量;
2、复合运算符右边的表达式计算完成后才参与复合赋值运算
五、自增和自减运算符:++、C 结合性:变量的自增或自减运算与该变量在表达式中的运算顺序无关知识点:
1、自增和自减运算符,可以放到变量前(前置运算)或后面(后置运算),前置运算时变量先做自增或自减运算,再将变化后的变量值参加表达式中的其它运算.后置运算时变量在参加表达式中的其它运算后,再做自增或自减运算.前置运算是变量先变化后使用,后置运算是先使用后变化; 六、逗号运算符: 表达式1,表达式2,……,表达式n 结合性:从左向右知识点:
1、逗号表达式的运算过程是:表达式1>表达式2>,……,>表达式n,整个表达式的值是最后一个表达式的值
七、条件运算符: x>y?x:y 结合性:是从右向左知识点:
1、表达式1?表达式2:表达式3.如1成立,2的值为整个表达式的值,否则3的值为整个表达式的值,是C语言的唯一的三目运算符
bash中$’ ‘ 和$” “的用法
Posted on 四月 2nd, 2010 in 学习总结, 经验分享 | No Comments ? $’string’ ―― 此处string一般被当做普通的字符串,但是string为以下的值的时候会被转义:
\a alert (bell)
\b backspace
\e an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\nnn 8进制数字表示的字符
\xHH 16进制数字表示的字符
\cx a control-x character $’string’这个特点很大程度上类似单引号的行为,但是可以比较容易在字符串中包含单引号。比如:
[root@pdcserver /root]
# echo $'\'' [root@pdcserver /root]
# echo $'\\'
$”string” ―― 这个行为和$’string’完全不同!此时会将string的值按照当前的locale进行本地化翻译,但如果当前locale为C或者POSIX,则被忽略。具体如何翻译请参考 ,不懂请自行研究,我要睡觉了。:)
bash中[[ ]]运算符的作用
Posted on 四月 2nd, 2010 in 学习总结, 经验分享 | No Comments ? bash中[[ ]]运算符主要用来为两个字符串做正则匹配,右面的字符串为正则表达式。可以使用 == 和 != 来进行模式匹配。若需要对右面字符串中存在的*等特殊字符取消扩展,则将该符号两侧添加引号即可。如:
[root@pdcserver /root]
#[[ "hello" == h* ]] && echo good || echo lost
good
[root@pdcserver /root]
#[[ "hello" == h"*" ]] && echo good || echo lost
lost == 的另外一种变体是 =~ ,这个时候正则采用ere进行匹配,更重要的是,此处引入了一个数组BASH_REMATCH[]。数组下标的值表示正则匹配中的某一部分。
[root@host /etc/xen]
#[[ "hello,world" =~ h(.*)o(.*) ]] && echo ${BASH_REMATCH[1]}
ello,w 第一个括号(.*)匹配了ello,w,所以BASH_REMATCH[1]的值为ello,w
[root@host /etc/xen]
#[[ "hello,world" =~ h(.*)o(.*) ]] && echo ${BASH_REMATCH[2]}
rld 注意:bash3.0中,需要使用如下方式
[[ "hello,world" =~ h\(.*\)o\(.*\) ]] && echo ${BASH_REMATCH[1]} 否则会有语法错误!建议无论什么时候都为括号加上转义符。
bash sh和启动文件读取顺序
Posted on 三月 29th, 2010 in 学习总结, 经验分享 | No Comments ? 注意:以下全部来自rhel5.3的man手册,粗体部分为man手册中内容,有任何疑问请自行查看。在理解bash关于启动文件的读取顺序之前,先看下面两个定义:
A login shell is one whose first character of argument zero is a -, or one started with the Clogin option. An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to terminals, or one started with the -i option. 比如登录一台pdcserver的主机,这时echo $0的结果为
[root@pdcserver /root]
#echo $0
-bash 如果我运行bash,再echo $0,则结果为:
[root@pdcserver /root]
#bash
[root@pdcserver /root]
#echo $0
bash 两次结果是不同的,第一个shell为login shell。两次echo $-的结果是相同的
[root@pdcserver /root]
#echo $-
himBH
结果中都包含了i,说明bash此时处于interactive shell。 bash如果作为interactive login shell启动,或者是非interactive shell但是以Clogin参数启动,它首先运行/etc/profile文件,然后依次查找 ~/.bash_profile, ~/.bash_login 和~/.profile文件,并且运行第一个找到的文件。Cnoprofile可以禁止这个行为。如果一个login shell退出,bash执行 ~/.bash_logout。
此处看起来有点拢谝痪渲械奶跫遣皇强梢约虻タ醋bash作为login shell启动则运行。。。文件?简单的说,一般用户登录的时候,bash仅仅按照优先级查找~/.bash_profile, ~/.bash_login 和~/.profile中最先存在的那个文件,然后运行。但是事实上.bashrc和/etc/bashrc还是会运行的,因为.bashrc的运行一般是写在.bash_profile中的,而/etc/bashrc文件的运行是写在.bashrc中的。如果bash作为interactive shell但不是login shell,bash执行~/.bashrc,Cnorc可以禁止这个行为;Crcfile file可以指定代替~/.bashrc的文件。
此处即为登入主机后继续运行bash后的状态,此时bash只会运行.bashrc而不会运行.bash_profile。比如cd /etc/xen若写在.bash_profile中,则用户登录的时候会自动进入到/etc/xen,但是用户再次运行bash的时候,则不会改变目录到/etc/xen。而将cd /etc/xen写在.bashrc中则依然会改变当前目录。如果bash以non-interactive运行一个shell,它查找环境变量BASH_ENV定义的值,并把这个值作为文件名,然后导入这个文件中的定义的变量和函数。此时bash的行为和下面语句类似:
if [ -n "$BASH_ENV" ]; then . “$BASH_ENV”; fi
注意:此时PATH的值不会被bash用来搜索BASH_ENV定义的文件路径。
BASH_ENV可以在写脚本的时候定义,在脚本中bash默认是非interactive shell。如果bash使用sh启动,它会尽量模仿早期的sh版本,并进入POSIX模式。如果此时sh作为interactive login shell启动,或者是非interactive shell但是以Clogin参数启动,它按顺序读取/etc/profile 和 ~/.profile,Cnoprofile可以禁止这个行为。如果sh是interactive shell启动,sh查找环境变量ENV定义的值,并把这个值作为文件名,然后导入这个文件中的定义的变量和函数。由于sh不会尝试读取和执行任何定义在启动文件中的命令,所以Crcfile参数没有任何效果。如果sh以non-interactive运行一个shell,它不会读取任何文件,且此时bash进入POSIX模式。如果bash以POSIX模式启动,它遵循POSIX定义的启动文件标准,在这种模式下,interactive shell扩展了ENV环境变量,其他的启动文件则不会读取。如果一个远程shell被打开(比如rsh和ssh),bash会尝试执行~/.bashrc,但是如果shell是sh,则不会有这个行为。
即如果.bashrc中包含了cd /etc/xen,则ssh root@host “pwd” 得到的结果为/etc/xen,否则为/root
Fedora12(i386) 安装chrome浏览器
Posted on 三月 1st, 2010 in 学习总结, 经验分享 | No Comments ? 在使用fedora 12后,安装使用google chrome 浏览器(google-chrome-unstable-5.0.335.0-39561.i386),安装完成后,发现启动后,不能打开网页 经过检查发现,原来问题出在Fedora 12的库文件中有些没有建立软链接.
通过命令行来检查运行chrome缺少的动态库
ldd /opt/google/chrome/chrome | grep "not found" 命令执行结果输出:
libbz2.so.1.0 => not found
libnss3.so.1d => not found
libnssutil3.so.1d => not found
libsmime3.so.1d => not found
libplc4.so.0d => not found
libnspr4.so.0d => not found bzip2-libs
nss
nss-util
nspr cd /lib
ln -s libbz2.so.1.0.4 libbz2.so.1.0
ln -s libplds4.so libplds4.so.0d
ln -s libplc4.so libplc4.so.0d
ln -s libnspr4.so libnspr4.so.0d cd /usr/lib
ln -s libnss3.so libnss3.so.1d
ln -s libnssutil3.so libnssutil3.so.1d
ln -s libsmime3.so libsmime3.so.1d
经过上述 动态链接库的修正后,在运行chrom时,会出现如下错误
[4126:4135:15967245054:ERROR:/usr/local/google/b/slave/chrome-official-linux/build/src/base/shared_memory_posix.cc(192)] Creating shared memory in /dev/shm/com.google.chrome.Thjcof failed: 没有那个文件或目录
[4126:4135:15967245111:ERROR:/usr/local/google/b/slave/chrome-official-linux/build/src/base/shared_memory_posix.cc(194)] This is frequently caused by incorrect permissions on /dev/shm. Try 'sudo chmod 777 /dev/shm' to fix.
[4126:4126:15967335985:ERROR:/usr/local/google/b/slave/chrome-official-linux/build/src/base/shared_memory_posix.cc(192)] Creating shared memory in /dev/shm/com.google.chrome.6BoOzH failed: 没有那个文件或目录从错误来看,运行的普通用户没有权限写/dev/shm 解决办法修改 /dev/shm 的权限 我们通过修改 /etc/fstab 来改变 /dev/shm的挂载权限
tmpfs /dev/shm tmpfs defaults,mode=777 0 0 然后重新挂载 /dev/shm 就可以了
umount /dev/shm
mount -a
再次运行google-chrome,打开网页正常。总结:通过如上问题的查找与修正,如果图形化打开有问题,可以试着通过命令行方式启动程序,这样可以看到更多的输出信息,帮助查找问题和解决问题!
系统管理中 bash shell 脚本常用方法总结
Posted on 二月 25th, 2010 in 学习总结, 未分类, 经验分享 | No Comments ? 在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!