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