shell编程简介

来源:互联网 发布:多媒体教学软件破解版 编辑:程序博客网 时间:2024/05/21 10:01

shell编程简介

在Bash的命令行上输入命令,然后Shell负责执行命令,shell脚本以简单的形式组合了一些命令,并一条街一条地执行他们,从而自动完成任务,这只是脚本的一部分功能。

shell脚本本身就是一种简单的编程语言。在linux下组合shell应用,可以在很短的时间内解决问题。

2.1.1创建脚本

遵循以下步骤创建脚本文件

1、使用自己喜欢的编辑器加载文件

2、确认脚本文件的第一行是:# ! /bin/bash

3、保存并退出

4、使用“chmod a+x 脚本文件名”,标记脚本文件的可执行属性

5、使用“./脚本文件名”,执行脚本文件


2.1.3返回值

当执行完一个程序后敲入命令 echo $?

若返回值为0,表示程序返回正常退出

若返回值为1—127 程序因发生错误而退出

若大于或等于128 程序被一个信号中断

2.1.4 简单命令组合

    使用分号串联

   条件组合  OR表示只有在第一个命令失败的时候,紧跟在后面的第二条命令才可执行 A||B,如果组合了多个命令,就一直执行到某个命令成功或者到执行完全部命令

                    AND 第一条成功,紧跟的第二条才可执行   A&&B如果组合了多个命令,就一直执行到某个命令失败或者到执行完全部命令

   ~$ ls&&echo It Worked || echo Failure

   ~$ if ls;then echo It Worked;else echo Failure;fi

两者等价

2.1.5 通佩符

 通配符是用来形成模板的特殊字符,用这个方法可以一次处理一组文件操作,即批处理

* ? [ ...] [...] [^...] {..,..}

2.1.6 引号和转义

声明那些字符没有特殊含义只是普通字符而已

$ echo hi > "Test File"
$ ls -l Test File
ls: 无法访问Test: 没有那个文件或目录
ls: 无法访问File: 没有那个文件或目录
$ ls -l Test\ File
-rw-rw-r-- 1 wujon wujon 3 11月  1 17:33 Test File
$ ls -l "Test File"
-rw-rw-r-- 1 wujon wujon 3 11月  1 17:33 Test File
$

单引号和双引号的差别

单引号禁止变量的插值,而双引号不禁止,意味着$符号在双引号扩起来的字符串中是不安全的

$ echo "Path: $PATH"
Path: /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ echo 'Path: $PATH'
Path: $PATH

在Bash中转义必须在特殊字符前插入反斜杠,即输出该字符,例子见上。

2.2 重定向和管道

Shell的一个强大的功能,可以随机组合程序,解决不断出现的新闻提,主要放法就是重定向和管道。

输出重定向:可以获得在屏幕上显示的内容,并把他存在文件里

输入重定向:可以用文件的内容代替需要从键盘输入的内容

管道:可以将命令串联在一起。

2.2.1输出重定向

  将显示在屏幕上的信息被写入到文件

$ ls -l > listing
$ cat listing
总用量 52
-rw-r--r-- 1 wujon wujon 8942 10月  8 17:12 examples.desktop
-rw-rw-r-- 1 wujon wujon    0 11月  1 19:24 listing
-rwxrwxr-x 1 wujon wujon   97 11月  1 16:49 myscript
drwxrwxr-x 2 wujon wujon 4096 10月 18 15:51 Ubuntu One
drwxr-xr-x 2 wujon wujon 4096 10月 10 14:06 公共的
drwxr-xr-x 2 wujon wujon 4096 10月 10 14:06 模板
drwxr-xr-x 2 wujon wujon 4096 10月 10 14:06 视频
drwxr-xr-x 2 wujon wujon 4096 10月 10 14:06 图片
drwxr-xr-x 2 wujon wujon 4096 10月 10 14:06 文档
drwxr-xr-x 3 wujon wujon 4096 11月  1 19:21 下载
drwxr-xr-x 2 wujon wujon 4096 10月 10 14:06 音乐
drwxr-xr-x 2 wujon wujon 4096 10月 10 14:06 桌面

大于号> 是输出重定向操作符,把传到标准输出的内容传送到一个特定的文件中。

$ ls -l /dev/tty6*  /dev/nox > listing
ls: 无法访问/dev/nox: 没有那个文件或目录
$ cat listing
crw-rw---- 1 root tty 4,  6 11月  1 19:20 /dev/tty6
crw--w---- 1 root tty 4, 60 11月  1 19:20 /dev/tty60
crw--w---- 1 root tty 4, 61 11月  1 19:20 /dev/tty61
crw--w---- 1 root tty 4, 62 11月  1 19:20 /dev/tty62
crw--w---- 1 root tty 4, 63 11月  1 19:20 /dev/tty63

上面的例子中没有将错误进行重定向处理,所以错误信息仍然在屏幕上输出,处理如下:

$ ls -l /dev/tty6*  /dev/nox > listing 2> listing.err
$ cat listing.err
ls: 无法访问/dev/nox: 没有那个文件或目录
$ cat listing
crw-rw---- 1 root tty 4,  6 11月  1 19:20 /dev/tty6
crw--w---- 1 root tty 4, 60 11月  1 19:20 /dev/tty60
crw--w---- 1 root tty 4, 61 11月  1 19:20 /dev/tty61
crw--w---- 1 root tty 4, 62 11月  1 19:20 /dev/tty62
crw--w---- 1 root tty 4, 63 11月  1 19:20 /dev/tty63

标准输出的文件描述符号是1,标准错误处理是2,即可根据文件描述符告诉Bash要做什么


$ ls -l /dev/tty6*  /dev/nox > listing 2>&1
$ cat listing
ls: 无法访问/dev/nox: 没有那个文件或目录
crw-rw---- 1 root tty 4,  6 11月  1 19:20 /dev/tty6
crw--w---- 1 root tty 4, 60 11月  1 19:20 /dev/tty60
crw--w---- 1 root tty 4, 61 11月  1 19:20 /dev/tty61
crw--w---- 1 root tty 4, 62 11月  1 19:20 /dev/tty62
crw--w---- 1 root tty 4, 63 11月  1 19:20 /dev/tty63

将正确的和错误的都输出到listing中,其中也可以用这条命令 $ ls -l /dev/tty6*  /dev/nox  &>  listing 

如果输出文件已经存在,我们用>将会把原来的数据清除掉,然后写进新的数据,如果我们想保留源文件中的数据,用>>即可(在原文件结尾添加数据)


2.2.3管道

管道可以直接获得一个程序的输出,然后作为输入传送给第二个程序,不会产生临时文件。

eg:

$ ls /dev/vcsa* | sed s./dev/.. | tac | rev
7ascv
6ascv
5ascv
4ascv
3ascv
2ascv
1ascv
ascv

ls显示vcsa*文件,用sed函数将前面的/dev/删掉,然后将顺序颠倒,最后用rev函数将每行颠倒


2.3.1环境变量

环境变量的俩个特殊的地方 :1、他们可以由其他程序传递给脚本 2、在脚本中被调用的任何程序,将继承环境变量

$ LESS=-i

$ export LESS

$ echo $ LESS

-i

删除环境变量

$ unset LESS


2.4 函数

目的:除了创建独立的脚本来完成重复性的任务外,还可以在脚本中(甚至在命令行中)使用函数,最大程度地降低代码重复输入的次数。

函数与脚本相似点:都可以带参数

                   不同点:脚本需要被一个独立的进程调用并控制,因此脚本不能修改在当前Shell上下文中的变量

shell 中如果对通配符不加引号的话,通配符会自动扩展ls 也是如此。


2.5 条件和循环

Bash条件的基础是if . . . fi 语句。其一般形式为:

if list; then  list; [ elif  list; then list; ]  . . . [ else  list; ]  fi


2.5.3 case

case命令用于在从一个列表中选择出一项,该列表是基于某一变量的值。是一系列 if . . . elif 语句的替代

基本语法:

case word in [(pattern [|pattern] . . . )list ;;] . . esac


2.5.4 while

while将连续执行一段代码,直到条件为假,就退出循环

基本语法:

while list; do list; done

2.5.5for

for语句用来重复一个预订的列表,为列表中每项执行特定的命令。

基本语法:

for  name [  in word;  ]  do list;  done

 






















      

原创粉丝点击