零之前言
对于Linux用多了,一次性启动多个文件感觉有些不方便,于是感觉有必要学习一下shell脚本的编程,这样对于使用一些多文件的项目可以自己编写Shell然后执行,此处的Shell是指Bourne Shell
或者Bourne Again Shell
。这两者就是常见的.sh
与.bash
这两种文件的解释器。说道解释器,你就应该能把这个shell理解为像Python一样的语言了,只不过它是用户与内核沟通的桥梁。
本记录是在边学习边记录
,并不是像以前那样学完了一段时间后再进行总结,所以可能错误会更多,希望读者不要在我这一篇文章上吊死。
一.前言——Shell
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。
常见的shell种类有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- 他们的区别(搬运菜鸟教程里的一则)
二.新建与运行脚本
1.新建脚本文件并写入内容:
gedit a.sh & gedit b.bash
分别写入:
echo "Hello SH"
echo "Hello Bash"
2.修改权限:
chmod +x a.sh b.bash
当然,给777的权限也行。
3.运行:
① 你可以像Python那样,确定解释器再运行,比如:
sh a.sh
或者给出解释器的全局路径 /bin/sh a.sh
② 或者是在脚本里的第一行,写上解释器:
#!/bin/bash
然后直接运行 ./a.sh
③或者全省了吧,linux默认了打开方式: ./a.sh
以下是运行结果,我们可以看到,使用echo 输出了我们的命令。
三.变量
1.声明与使用
声明变量直接如同python那样 xx = xx 即可,且变量名的定义有以下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
而使用已声明的变量则是:${xx} 即美元符号加大括号,当然你可以不使用大阔号,但容易出现‘粘连现象’就是把变量名后的文本也被当成了变量名的一部分,所以推荐给每一个变量都添加大括号。
** 注意 赋值的等号左右别加空格**
以下下是个错误例子:
name = "Hello"
echo ${name}
正确写法:
name="Hello"
echo ${name}
2.只读变量
在赋值后,直接添加readonly关键字即可,之后所有对其修改的代码均会报错。
a.sh: 3: a.sh: name: is read only
name="runoob.com"
readonly name
name="233"
echo ${name}
3.删除变量
对于变量的删除,直接使用unset关键字,就不演示了。
4.环境变量
直接搬运,并没有说如何申明,应该是以后再说的。
运行shell时,会同时存在三种变量:
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
四.字符串
shell的字符串和Python的有所不同,它区分单双引号:
1.单引号
菜鸟教程原话:
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
对于其二,可以看看以下代码:
2.双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
3.拼接例子
直接搬运,就上面所述的那意思:
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
4.字符串操作
①字符串长度
在变量名前加#,例如:
string="abcd"
echo ${#string} #输出 4
②提取字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
③查找字符串
形如这样`expr index “$string” io `
string="runoob is a great site"
len=`expr index "$string" io`
echo ${len} # 输出 4