126 lines
4.6 KiB
Markdown
126 lines
4.6 KiB
Markdown
---
|
||
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]
|
||
``` |