Utilize shell scripts,linux commands, open source tools,java, to Maximize the Power of Linux.
Focused on working with linux and shell, search engine technology including Chinese segmenter
Any questions please contact me at gmail: david.ullua

2/04/2007

Shell Programming FAQ(为什么shell脚本无法运行?)

上 个月在CU(ChinaUnix)的论坛上看到有人贴出帖子说在shell下面运行不了if...else语句,而且还大骂linux说linux连最简 单的事情都做不了。这几天写了几个脚本处理日常工作,也遇到一些问题,也许CU论坛上骂linux的这位仁兄,也是因为遇到类似的问题,所以才会骂 linux。总结一下常见的问题如下,其中涵盖有赋值表达式,逻辑运算符(if),命令替换,环境变量设置(export)等,希望对初学shell编程 的朋友有所帮助。有任何问题可在论坛上联系我,或者email到david.ullua at gmail。 -- David Euler,2006/12/14

Q1.我在shell脚本中加入如下:i = 1 ,运行的时候脚本报错,难道shell下面不可以对变量赋值吗?
A1.赋值运算符前后不可以有等号=。试试i=1

Q2.我再shell上运行i=1;i++报错"-bash: i++: command not found", 运行i=1;i=i+1;echo $i 结果不是2,而是"i+1", shell如何支持算术运算呢?
A2.i++的表达方法在shell中是不被支持的;表达式的右边引用变量,变量名前面要加$;表达式求值时表达式要用$((expression))的形式把表达式expression括起来。所以正确的是:
i=1;i=$(($i+1));echo $i

Q3.我需要设置JAVA_HOME变量,于是按照一些教程,使用下面命令,为什么会报错?是不是shell不兼容?
export JAVA_HOME = /working/jdk1.5.0_09
A3.试试
export JAVA_HOME=/working/jdk1.5.0_09, 两个有什么区别呢,前面的=前后多了1个空格,shell下面=作为赋值运算符时前后不可有空格

Q
4.我按照教科书上说的使用命令替换,把date命令的运行结果保存到DATE变量,DATE='date';echo $DATE; 可运行结果是:date, 而不适date命令的结果。
A4.命令替换是要用后引号(`,Shift+~)而不是单引号把命令括起来。 运行DATE=`date`;echo $DATE; 试试


Q5.我运行if 语句来测试逻辑表达式:
if[ "$SHELL"="/bin/bash" ]; then echo "bash";fi
中括号[]的前后都用了空格,为什么还会报错呢?
A5.上面的shell句子有两处语法错误:if后面也需要有空格;等于号"="作为逻辑运算符时,前面和后面都必须要有空格,否则会被shell作为赋值表达式,linux下面赋值运算符与逻辑运算符等于都用"="表示,区别在于前后有无空格。正确的如下:
if [ "$SHELL" = "/bin/bash" ]; then echo "bash";fi


No comments:

About Me

I am a senior developer and a team leader with 3 years development experience in Suzhou, China, focus on mobile web search, linux, Java and machine learning in NLP (natural language processing). My goal is to improve people's life with computer technology.