--- title: 2.0 shell编程(1)-初见 date: 2018-5-5 22:38:32 tags: - linux - shell categories: - linux --- `shell`俗称为**壳** , 是指提供使用者使用界面的软件 也叫做命令解析器 接收用户的命令 , 然后调用相应的应用程序 (接收命令的方式可以是命令行 , 也可以是图形界面) 在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] ```