免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11262 | 回复: 18
打印 上一主题 下一主题

闲来无事,写篇文章。30分钟搞定BASH脚本编程! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-04-10 10:21 |只看该作者 |倒序浏览
30分钟搞定BASH脚本编程
chu888@263.net
一个最简单的脚本
这篇指南将通过一些例子来帮助大家学习功能强大的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 (!=)

论坛徽章:
0
2 [报告]
发表于 2003-04-10 12:30 |只看该作者

闲来无事,写篇文章。30分钟搞定BASH脚本编程!

支持一下。

论坛徽章:
0
3 [报告]
发表于 2003-04-10 13:29 |只看该作者

闲来无事,写篇文章。30分钟搞定BASH脚本编程!

整是要找的,抄下来。

论坛徽章:
0
4 [报告]
发表于 2003-04-11 21:17 |只看该作者

闲来无事,写篇文章。30分钟搞定BASH脚本编程!

喜欢,非常好,简单明了。

论坛徽章:
0
5 [报告]
发表于 2003-04-11 21:36 |只看该作者

闲来无事,写篇文章。30分钟搞定BASH脚本编程!

请问bash能不能达到windows下的批处理文件的功能啊,
假如我要在当前目录下执行.sh文件,改变当前目录到指定的目录下,
在windows下非常简单, 只要cd 路径名就好了,
那要是用bash的话
#! /bin/bash
cd /usr/java/javawork
#end
可是这样执行好象不能改变当前目录啊,!

论坛徽章:
0
6 [报告]
发表于 2003-04-11 21:46 |只看该作者

闲来无事,写篇文章。30分钟搞定BASH脚本编程!

谢谢,明天把它放到本本里

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2003-04-11 22:41 |只看该作者

闲来无事,写篇文章。30分钟搞定BASH脚本编程!

原帖由 "sky-wu" 发表:
请问bash能不能达到windows下的批处理文件的功能啊,
假如我要在当前目录下执行.sh文件,改变当前目录到指定的目录下,
在windows下非常简单, 只要cd 路径名就好了,
那要是用bash的话
#! /bin/bash
cd /usr/j..........

bash可以完成的工作windows下的批处理绝对做不到
脚本执行的时候是在脚本自己的环境中运行的,这个环境和你的当前环境并不是同一个环境,因此你不能用那个脚本来更改你的当前目录,好像是这样的,

论坛徽章:
0
8 [报告]
发表于 2003-04-12 10:01 |只看该作者

闲来无事,写篇文章。30分钟搞定BASH脚本编程!

简洁明了,虽然很多地方都有这样的描述。
但还是谢谢。

论坛徽章:
0
9 [报告]
发表于 2003-05-05 19:19 |只看该作者

闲来无事,写篇文章。30分钟搞定BASH脚本编程!

老师,来这开小灶啊?

好啊,我回去告诉他们。

论坛徽章:
0
10 [报告]
发表于 2005-10-31 10:29 |只看该作者
对于刚刚学习bash的朋友
很有帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP