这篇文章是根据jolestar的博客进行了微小修改,主要是去掉了示例,如果觉得有问题可以去原作者博客阅读,地址如下:
http://jolestar.javaeye.com/blog/179900
Shell语法相对简单,只是由于不懂他的特别之处所以花费很多冤枉时间,希望引以为戒。
推荐网址:
http://zh.wikipedia.org/wiki/Bash
http://www.aka.org.cn/Lectures/002/Lecture-2.1.2/index.html
=======================================
一.变量:变量直接赋值,不用提前声明。
注意几点:
1.变量和值之间不能有空格,否则解释器会认为是几个命令。很多程序员的习惯是在=号两边留空格为了好看,但这点在shell中行不通。
2.字符串不必用"号或者',除非字符串之间有空格的时候。
3,var= ,这样的语句也是合法的,表示var的值为空。
4.使用变量的时候需要在变量前面加上$符号。这一点php程序员比较熟悉。
但与php不同的是变量赋值的时候不用加$符号。因为shell中没有==这个符号,判断相等也是用=号。如果赋值的时候加上$号,会产生混淆。
5,字符串复制三种方法,直接写用(')或者("),注意区别
还有一点要注意的就是单引号(')字符串 中的变量不会被替换。
6,所有变量前必须加$,三个例外,定义,被赋值,for中循环变量
二.语句
1.shell的语句不必用;号结束,除非是同一行写几个语句的时候。
2,if-else-elif-fi, for..in..do--done
5.条件语句
shell中的条件语句用[]号括起来,用于if,while,until等结构。
条件判断用=号,而不是==号,两边必须有空格,。条件语句与[] 号之间要有空格分开。
还有要注意的是条件语句中=号两旁要有空格分开,否则shell会将条件语句整个作为一个字符串处理,条件永远为真。条件语句中的变量最好用"号引起来,否则如果该变量中有空格,shell就会报too many arguments错误。如果变量正好为空,则会报 =: unary operator expected.错误。因为变量为空的话,条件语句少了一边,当然会出错。所以,将字符串变量用双引号括起来是shell编程的好习惯,尤其在条件语句中。
算术比较运算符
num1-eq num2 等于 [ 3 -eq $mynum ]
num1-ne num2 不等于 [ 3 -ne $mynum ]
num1-lt num2 小于 [ 3 -lt $mynum ]
num1-le num2 小于或等于 [ 3 -le $mynum ]
num1-gt num2 大于 [ 3 -gt $mynum ]
num1-ge num2 大于或等于 [ 3 -ge $mynum ]
字符串比较运算符
-z string 如果 string长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string长度非零,则为真 [ -n "$myvar" ]
string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]
string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]
***)如果可能尽量用 -z 测试,个人实验 -n 好像不好用
6.case 语句
case语句的语法比较怪,乍一看比较别扭。每个pattern用 半括号括起来,用;;结束。
三.算术
shell 默认是用来处理字符串的,所以如果你直接运行:
echo 1+1
它会直接输出1+1,而不会输出2。 如果需要计算表达式的值,则只需用"$((" 和 "))"将表达式括起,或者用let 或则 expr。
let var=$var+1
expr var=$var + 1
echo $((1+1))
被赋值的变量不需要$
四.函数
Js代码
1. add(){
2. result=0
3. for n in $*
4. do
5. result=$(($result+$n))
6. done
7. return $result
8. }
add(){
result=0
for n in $*
do
result=$(($result+$n))
done
return $result
}
执行:
Java代码
1. add 1 2 3
2. echo $?
3. echo $result
add 1 2 3
echo $?
echo $result
两个输出结果都是:6.
这里需要几点说明.shell中是不能直接获得函数的返回值的,如果你要用函数返回值,只能用全局变量传输。shell中的变量默认都是全局的,除非你在前面加了local修饰符。如上面的例子,在函数外面,result变量也是可见的。如果你在result前加local修饰,result变量在函数外就不可见了。但shell会把函数返回值放在$?全局变量中,你可以用$? 来取得前个函数调用的返回值。$*可以获得函数的所有输入参数,$1表示第一个参数,以此类推。
五.其他
1, 使用别的命令的结果用(`:注意和'区别)括起来
2,
文件比较运算符
-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
杂记
1,[命令],命令和括号间必须有空格,我的经验是凡事多加空格,好看,避免错误
2,变量大写,习惯
没有评论:
发表评论
写下你的意见和问题,一起进步。谢谢