blog-web/source/_posts/linux/2.0、shell编程(1)-初见.md
2018-05-10 09:47:30 +08:00

126 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 2.0、shell编程(1)-初见
date: 2018-5-5 22:38:32
tags:
- linux
- shell
categories:
- linux
---
`shell`俗称为**壳** , 是指提供使用者使用界面的软件
也叫做命令解析器
接收用户的命令 , 然后调用相应的应用程序
(接收命令的方式可以是命令行 , 也可以是图形界面)
<!-- more -->
在linux发展过程中 , 出现过很多的shell
+ `sh`(全称 Bourne Shell): 是UNIX最初使用的 shell而且在每种 UNIX 上都可以使用。
Bourne Shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种 shell。
+ `bash`(全称 Bourne Again Shell: LinuxOS 默认的,它是 Bourne Shell 的扩展。
与 Bourne Shell 完全兼容,并且在 Bourne Shell 的基础上增加了很多特性。可以提供命令补全,命令编辑和命令历史等功能。它还包含了很多 C Shell 和 Korn Shell 中的优点,有灵活和强大的编辑接口,同时又很友好的用户界面。
+ `csh`(全称 C Shell): 是一种比 Bourne Shell更适合的变种 Shell它的语法与 C 语言很相似。
Tcsh: 是 Linux 提供的 C Shell 的一个扩展版本。
Tcsh 包括命令行编辑,可编程单词补全,拼写校正,历史命令替换,作业控制和类似 C 语言的语法,他不仅和 Bash Shell 提示符兼容,而且还提供比 Bash Shell 更多的提示符参数。
+ `ksh` (全称 Korn Shell): 集合了 C Shell 和 Bourne Shell 的优点并且和 Bourne Shell 完全兼容。
+ `pdksh`: 是 Linux 系统提供的 ksh 的扩展。
+ `pdksh` 支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序。
---
+ **交互式shell** : 等待用户的命令 , 提交后就立即执行该命令
+ **非交互式shell** : 不等待用户的输入 , 而是去读取写在文件中的命令代码 , 并且执行 , 这个文件就被称为shell脚本
> **脚本**其实就是短小的、用来让计算机自动化完成一系列工作的程序,这类程序可以用文本编辑器修改,不需要编译,通常是解释运行的。
### Hello World
test.sh
```bash
#!/bin/bash
echo "Hello World!"
```
echo就是对传入的参数直接进行输出的程序
这个脚本的作用就是执行该命令
`#!`是一个约定的标记 , 它告诉系统这个脚本要用什么解释器来执行
之后需要给这个文件加上可执行权限
`chmod +x test.sh`
然后就可以执行该脚本了
`./test.sh`
当然如果这样执行 , 是根据脚本内容中指定的解释器运行
如果没有指定 , 则使用系统默认的
我们也可以在运行时指定使用某个解释器
比如`sh test.sh`
### 变量
命名规则是可以包含 字母 数字 下划线 , 且以字母或者数字开头
使用变量则是在前面加`$`或者用`${}`
( 当然如果在字符串内部使用 , 为了防止歧义, 必须用${} )
```bash
name="sookie"
echo $name
echo "my name is ${name}123"
# 大括号是为了帮助解释器识别变量名称的边界
#将该变量设为只读, 之后若再赋值就会报错
readonly name
```
**注意** : 等号的两端不能加空格
#### 删除变量
使用`unset 变量名称`可以删除对应的变量
> 按照上面方式定义的变量实际上是这个shell脚本当中的**局部变量**
在操作系统当中可以设置**环境变量** , 所有的shell脚本当中都可以直接使用
### 字符串
字符串的边界可以是单引号也可以是双引号 也可以无引号 , 但是实际应用当中有一些区别
+ `单引号`当中的内容都会原样输出 , 不可以使用转义字符 , 不可以使用字符串模板
+ `双引号`当中的内容可以使用转义字符 , 也可以使用字符串模板
+ `无引号`不可以使用转义字符 , 但是可以使用字符串模板
```bash
name="sookie"
echo 'my name is ${name}1'
# output: my name is ${name}1
echo "my name is ${name}1"
# output: my name is sookie1
echo my name is ${name}1
# output: my name is sookie1
```
#### 字符串操作
shell当中字符串的拼接不需要用加号
直接写在一起即可
```bash
name="sookie"
echo 'my name is '${name}
#获取字符串长度
echo ${#name}
#截取子串
echo ${name:1:3} #输出 ook
#将字符串内容当做命令执行
echo `ls /usr/local`
```
### 数组
同大多数解释型语言一样 , 对于数组并没有严格的越界限制
```bash
#数组定义, 元素之间用空白分割
arr=(1 "aa" 2.6)
#超出当前数组边界的下标形式赋值, 会将元素追加至末尾
arr[6]="bb" #当前数组当中有4个元素
#获取数组长度
echo ${#arr[@]}
#遍历数组
for item in ${arr[@]}
do
echo ${item}
done
#删除数组元素
unset arr[1]
```