30分钟搞定BASH脚本编程

一个最简单的脚本  
这篇指南将通过一些例子来帮助大家学习功能强大的shell脚本编程. 
在这一节中我将学习一些简单的脚本,它将有利于你深入学习一些知识。 
一个最经典的Hello World程序  
          #!/bin/bash           
          echo Hello World     
         
这个脚本只有二行,它的第一行这个脚本程序由那个程序来解释.第二行只有一个简单的动作,它的功能是在终端上打印出一行”Hello World” 。如果你测试着执行这个命令时(./hello.sh),你将会得到一个command not found的信息,这种情况大部分可能是你的第一行#!/bin/bash这个程序有问题,你一定要确保bash可以找到并且可用。(一般情况下你还要对这个脚本附一个可执行权限) 
#chmod u+x hello.sh 
一个非常简单的备份脚本 
        #!/bin/bash           
        tar -cZf /var/my-backup.tgz /home/me/ 
         
在这个脚本中,它替换了上一个例子的将一行信息打印在终端上的功能,取尔代之的是一个备份/home目录的tar备份命令。 
关于重定向的一些信息 
最基本的理论基础 
这里有对于三个文件的重定向定义: stdin(标准输入), stdout(标准输出) and stderr(标准错误输出) (std=standard).  
基本上你可以 
1. 重定向 stdout 到一个文件 
2. 重定向 stderr 到一个文件 
3. 重定向 stdout 到stderr  
4. 重定向 stderr 到 stdout  
5. 重定向 stderr 到 stdout 中并且成为一个文件  
6. 重定向 stderr and stdout to stdout  
7. 重定向 stderr and stdout to stderr  
在Linux中 1代表 '标准输出', 2代表’标准错误’ 
标准输出 
这个例子将会使ls的显示结果重定向到一个文件中. 
        ls -l > ls-l.txt 
         
标准错误 
这个例子将会使grep命令在运行过程中出现的错误输出到一个文件中  
        grep da * 2> grep-errors.txt 
         
管道 
这一节我们将解释一个非常简单的并且你以后一定会用到的功能,它就是管道。  
为什么大家都会用到管道? 
管道可以使你非常方便的将一个程序的结果转向到另外一个程序中。  
一个sed的例子 
这个例子使用了非常简单的管道功能: 
        ls -l | sed -e "s/[aeio]/u/g"    
         
当我们执行以下命令后:首先ls –l会先执行并且它会输出结果信息但是如果它的后面跟是一个管道符的话,那么它就会将结果重新定向到sed这个程序中,sed使用了替换功能,所以这个例子执行完会,会将ls –l结果中所有含有aeio的英文单词替换成单词u.  
通过另外的方法实现ls –l *.txt 
也许这种方法不同于ls –l *.txt,但是它避免了出现一条 No Such file Or Directory这种信息。  
        ls -l | grep ".txt" 
         
当ls –l 执行后,它会将程序结果输出到grep这个程序中,并且去匹配.txt这条信息。 
变量 
你可在任何编程语言中使用变量,但是在脚本编程中它们是没有类型的,简称弱类型编程语言,在这个变量中可以保含一个数字,一个字符串,一个单词等。你并不需要声明这个变量,它会在引用这个变量时创建它。  
使用变量来实现一个简单的Hello World 
            #!/bin/bash           
            STR="Hello World!" 
            echo $STR     
             
第二行建立一个STR的变量并且为其附了一个“Hello World”的字符串变量值。当在这个变量前面加上一个$符号时,我们就将会得到这个变量的值。  
例子(一个使用变量的备份脚本)  
           #!/bin/bash           
           OF=/var/my-backup-$(date +%Y%m%d).tgz 
           tar -cZf $OF /home/me/ 
            
局部变量 
局部变量的生命是有限的,请看下面的例子 
                #!/bin/bash 
                HELLO=Hello  
                function hello { 
                        local HELLO=World 
                        echo $HELLO 
                } 
                echo $HELLO 
                hello 
                echo $HELLO 
         
条件语句 
条件语句可以使你决定是完成一个运作或是不去完成一个动作时,通过一些判断来实现,一般情况都是通过一些*作符来实现判断。  
条件语句可以有许多实现方法,最多的情况是基于if expression then 这种情况,也就是大家常常说的if判断语句。它的语法基本结构如下: 
if [expression];  
then  
code if 'expression' is true.  
fi  
一个最基本的使用if ...then的例子  
            #!/bin/bash 
            if [ "foo" = "foo" ]; then 
               echo expression evaluated as true 
            fi 
             
这段代码执行if判断,如果foo等于foo的话,那么你就会执行then语句下的输出语句,最后通过fi来结束,这里我要强调一点,就是很多新手在输入源码时特别是在if 语句后面没有空格,在大括号后面没有空格,在等号两边没有空格,这些都会制造出一些麻烦的。  
一个简单的控制if .. then ...else  
            #!/bin/bash 
            if [ "foo" = "foo" ]; then 
               echo expression evaluated as true 
            else 
               echo expression evaluated as false 
            fi 
             
6.4 通过变量进行判断控制 
            #!/bin/bash 
            T1="foo" 
            T2="bar" 
            if [ "$T1" = "$T2" ]; then 
                echo expression evaluated as true 
            else 
                echo expression evaluated as false 
            fi 
             
7. 循环结构 
在这一节中,你将会学习for、while、until loops循环 
对于for 循环它有一点不同于其他的编程语言,它有一点像VB中的for each语句,就是所谓的递归的循环。 
对于while循环,它其实是一个加强的if语句,如果它的条件为真,那么它就一直执行while循环中的语句中的内容。 
7.1 For sample  
        #!/bin/bash 
        for i in $( ls ; do 
            echo item: $i 
        done 
         
在第二行上,我们声明了一个i的变量,它将一直将ls命令的结果全部循环出来。其中do 和done之间是所要执行的代码。  
While循环例子 
         #!/bin/bash  
         COUNTER=0 
         while [  $COUNTER -lt 10 ]; do 
             echo The counter is $COUNTER 
             let COUNTER=COUNTER+1  
         done 
         这里面大家可能看到一个-lt的命令选项,这里它代表小于等于 
-eq 等于 
-ne 不等于 
-gt 大于 
-ge 大于等于 
-lt 小于 
-le 小于等于 
Until的例子 
         #!/bin/bash  
         COUNTER=20 
         until [  $COUNTER -lt 10 ]; do 
             echo COUNTER $COUNTER 
             let COUNTER-=1 
         done 
          
函数 
对于大多数编程语言,你都可以调用函数来执行一段代码,这样可以使用减少重复的书写代码。  
函数的例子 
           #!/bin/bash  
           function quit { 
               exit 
           } 
           function hello { 
               echo Hello! 
           } 
           hello 
           quit 
           echo foo  
            
在2-4行包含了一个quit函数,在5-7行包含了 hello函数,如果你不是很确定这个脚本是是什么意思,那么我建议试试它。Notice that a functions don't need to be declared in any specific order.  
当你运行这个脚本时你的程序将会最先调用hello函数,以后再调用quit函数最后才执行echo 输出命令。  
在函数中使用参数 
                #!/bin/bash  
                function quit { 
                   exit 
                }   
                function e { 
                    echo $1  
                }   
                e Hello 
                e World 
                quit 
                echo foo  

            
这个脚本几乎和前一个脚本没有什么不能,但最主要的不同是e这个函数可以使用参数了。  
用户接口 
使用select命令制作简单的菜单 
           #!/bin/bash 
           OPTIONS="Hello Quit" 
           select opt in $OPTIONS; do 
               if [ "$opt" = "Quit" ]; then 
                echo done 
                exit 
               elif [ "$opt" = "Hello" ]; then 
                echo Hello World 
               else 
                clear 
                echo bad option 
               fi 
           done 
           
如果你运行这个脚本你将会看到一个非常简单的菜单  
使用read读入用户输入 
在多数情况下你可能会用到提示请进行输入这种状态并且有几种方法可以用。这是其中的一种方法:  
                #!/bin/bash 
                echo Please, enter your name 
                read NAME 
                echo "Hi $NAME!" 
         
对于变量来说,你可以通过多个值来读入。  
                #!/bin/bash 
                echo Please, enter your firstname and lastname 
                read FN LN  
                echo "Hi! $LN, $FN !" 
         
算术*作 
使用以下的命令: 
echo 1 + 1  
如果你希望看到2,那么你会很失望,那么我们应该如何进行*作哪? echo $((1+1))  
我们可以使用以下方法: 
echo $[1+1]  
         
算术*作 
+  
-  
*  
/  
% (remainder)  
关系*作 
-lt (<  
-gt (>  
-le (<=)  
-ge (>=)  
-eq (==)  
-ne (!=)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值