维护支持 

Linux脚本-Shell(Bash)


发布时间:2009年10月22日  阅读次数:    

约定:本文中的shell特指bash.

一.变量
变量直接赋值,不用提前声明。

var="Hello"   
var=Hello   
var='Hello'   
   
注意几点:
1.变量和值之间不能有空格,否则解释器会认为是几个命令。很多程序员的习惯是在=号两边留空格为了好看,但这点在shell中行不通。
2.字符串不必用"号或者',上面的几种赋值方式是等价的。除非字符串之间有空格的时候。
如:

var="Hello World"   
   
这时候就需要用引号。
3.
var=

这样的语句也是合法的,表示var的值为空。

4.使用变量的时候需要在变量前面加上$符号。这一点php程序员比较熟悉。
如:

echo $var
   
这也就是为什么shell中的字符串不必用引号的原因。你如果直接运行
Js代码

echo var
   
系统会将var当作字符串,而不是变量处理。在变量前加上$号还有个好处就是在字符串中输出变量的时候,直接在字符串里面用变量就行。
如:

var=World
var2="$var World"
echo $var2
   

但与php不同的是变量赋值的时候不用加$符号。因为shell中没有==这个符号,判断相等也是用=号。如果赋值的时候加上$号,会产生混淆。
还有一点要注意的就是单引号(')字符串 中的变量不会被替换
   
var=World
var2='$var World'
echo $var2

上面的语句输出结果:$var World
这个可以用来输出$等特殊符号,而不用担心字符被当作变量替换

二.语句
1.shell的语句不必用;号结束,除非是同一行写几个语句的时候。

2.shell中的语句块不用{}号扩起来。if语句一般就用fi表示结束。当然这个也有特例,后面会提到。

3.if语句

if [ condition ]
then
    action
elif [ condition2 ]
then
    action2
.
.
.
elif [ condition3 ]
then
else
    actionx
fi

需要注意的是shell中没有elseif,而是elif(这个缩写也太变态了吧,有必要么?).
每个或者elif后跟着then,并且要换行或者用;分开。then可以和后面的action在一行。

3.for循环

var="one two three four"
for x in $var
do
     echo $x
done

for循环用do  和 done表示开始结束,不要举一反三,认为是用 rof结束。

4.while和util循环
   
while [ condition ]
do
     statements
done
   
until [ condition ]
do
     statements
done
   


5.条件语句
shell中的条件语句用[]号括起来,用于if,while,until等结构。
条件判断用=号,而不是==号。条件语句与[] 号之间要有空格分开。
如:

gender="boy"
if [ "$gender" = "girl" ]
then
      echo 'Welcome!'
else
      echo 'We only welcome girl.'
fi

还有要注意的是条件语句中=号两旁要有空格分开,否则shell会将条件语句整个作为一个字符串处理,条件永远为真。条件语句中的变量最好用"号引起来,否则如果该变量中有空格,shell就会报too many arguments错误。如果变量正好为空,则会报 =: unary operator expected.错误。因为变量为空的话,条件语句少了一边,当然会出错。所以,将字符串变量用双引号括起来是shell编程的好习惯,尤其在条件语句中。

其他的比较符号,如 >,<,不能直接在条件语句中使用,因为>号在shell中有特殊含义。下面是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" ]

6.case 语句

gender="boy"
case "$gender" in
      boy)
            echo "We only welcome girl."
            ;;
      girl)
            echo 'Welcome !'
            ;;
      *)
            echo "unknow."
            ;;
esac
   
case语句的语法比较怪,乍一看比较别扭。每个pattern用 半括号括起来,用;;结束。

三.算术
shell 默认是用来处理字符串的,所以如果你直接运行:

echo 1+1

它会直接输出1+1,而不会输出2。 如果需要计算表达式的值,则只需用"$((" 和 "))"将表达式括起。
   
echo $((1+1))
   
四.函数

add(){
    result=0
    for n in $*
    do
        result=$(($result+$n))
    done
    return $result
}
执行:
   
add 1 2 3
echo $?
echo $result

两个输出结果都是:6.
这里需要几点说明.shell中是不能直接获得函数的返回值的,如果你要用函数返回值,只能用全局变量传输。shell中的变量默认都是全局的,除非你在前面加了local修饰符。如上面的例子,在函数外面,result变量也是可见的。如果你在result前加local修饰,result变量在函数外就不可见了。但shell会把函数返回值放在$?全局变量中,你可以用$? 来取得前个函数调用的返回值。$*可以获得函数的所有输入参数,$1表示第一个参数,以此类推。

五.其他
shell内置的一些特征,可以很容易的处理文件,以及和其他程序交互。

文件比较运算符
-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 ]

for 循环中很容易遍历文件

for file in /home/*
do
   if [ -d "$file" ]
   then
      echo $file is a directory
    fi
done
很容易调用其他程序的输出结果

for user in `awk -F":" '{ print $1 }' /etc/passwd`
do
    echo find user $user
done
shell脚步中要使用其他命令的输出结果,只需用`符号把命令包含起来。注意:这个符号不是单引号,在键盘左上角那个位置。

shell是基础,要配合awk,grep,sed这些工具才能发挥出效果。

《unix编程艺术》,上面谈到了*nix系统的几个哲学基础原则,其中有个原则就是:
【组合原则:设计时考虑拼接组合】
*nix系统程序的的输入和输出一般都是简单,文本化,面向流的格式。这样便于程序和程序之间的交互和拼接。*nix系统下的程序一般都只完成单一功能,如果你需要要一个复杂的功能,那就需要把小程序拼接在一起。这一特征也决定了shell在*uix系统中的重要性。

shell学习资料
1.IBM Shell编程系列  
本文中的许多例子以及资料就是来自该系列教程
2.Bash 参考手册
Gnu的bash官方参考手册

 
关于北京博卡先锋软件开发有限公司
北京博卡先锋软件开发有限公司从事互联网软件开发和应用服务,拥有丰富的互联网技术开发和应用经验,在网站建设、即时通讯,企业办公自动化等领域具有领先的技术,是网站建设技术软件化的先行者,网页即时通讯领域的佼佼者。自主研发包括网站引擎(SiteEngine)、即时通讯(BICQ)、办公引擎(OfficeEngine) 等多款的高技术软件产品,为数以千计的各级政府部门、事业单位、大型集团企业、中小企业提供了各种信息化解决方案及各类信息化服务。博卡先锋采取多元化的产品发展战略,不断深化产品的应用领域,逐渐形成系列化的产品体系,以满足更广泛层面的需求,提供更加全面、优质的服务。目前,公司在大中华地区拥有100000家以上的企业软件用户,业务已拓展至包括东南亚、北美、澳洲、西欧在内的世界各地。

如果您喜爱这篇文章,请为它投票和评分。

当前评分: 0

   [加入收藏]   [推荐给朋友]   [打印]   [关闭]  
[返回目录]  [上一条]  [下一条]  
关键词:Linux 
最新排行
版权声明 - 网站地图 - 人才招聘 - 合作加盟 - 付款方式 - 友情链接 - 联系我们