什么是Shell
Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。
Shell 既是一种命令语言,又是一种程序设计语言。
Shell script 是一种为 shell 编写的脚本程序。Shell 编程一般指 shell脚本编程,不是指开发 shell 自身。
Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 解释器 种类众多,一个系统可以存在多个 shell,可以通过 cat /etc/shells 命令查看系统中安装的shell解释器。
Bash 由于易用和免费,在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
Shell解释器
java需要java编译器,同样Shell也需要Shell编译器
查看已安装的Linux系统支持哪些Shell解释器
Shell的Hello World
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。等同于Java的System.out.println("Hello World");C#的Console.WriteLine("Hello World");
执行Shell脚本
执行Shell脚本有三种方式
-
-
/bin/sh 1.sh 或者 /bin/bash 1.sh
- bash hello.sh 或者 sh hello.sh 为什么可以省略bin呢?因为在环境变量中已经配置了 可以用 echo $PATH进行查看
- ./1.sh
-
当执行时遇到经常遇到的问题,执行权限不足怎么办?
chmod 755 文件名 即可
Shell中的变量
在shell脚本中, 定义变量时,变量名不加美元符号($),如:your_name="zhangsan"
注意变量的等号两边不能有空格
同时,变量名的命名须遵循如下规则:
-
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
当你要使用定义的变量时:在变量前加入$即可,如 echo $your_name 或者 echo ${your_name}
当然变量的花括号是可以不写的,写的原因主要是指定花括号内的是变量名,其他的作为字符串,如:echo "I am ${your_name},I am 18 years old"
推荐所有的变量都使用花括号包裹起来,作为一个良好的编程习惯
回收变量,语法 unset 变量名。如:unset your_name
只读变量,语法 readonly 变量名。如:readonly your_name 当一个变量设置了只读属性时,就无法在进行修改赋值。否则会报错
Shell里的字符串
Shell中被单引号或者双引号包裹的都称之为字符串,那么它们之间有什么区别呢?
单引号包裹的字符串都会当作一整个字符串,也就是说在单引号内的变量是无效的,也就是${变量}无效
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号里可以有变量
双引号里可以出现转义字符
获取字符串的长度
echo ${#变量}
截取字符串
echo ${str:2} 意思是输出字符串从下标2开始等同于Java的substring(2),
echo ${str:2:2}意思是输出字符串从下标2开始输出2位等同于Java的substring(2,2),
查找字符串
str="I am goot at $skill"
echo `expr index "$str" am` # 输出是: 3 等同于Java中的IndexOf("am");
Shell里的传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。 n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
实例
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:
vim /export/sh/param.sh
为脚本设置可执行权限,并执行脚本,
输出结果如下所示:
另外,还有几个特殊字符用来处理参数:
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
Shell的算数运算符
Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符。原生 bash 不支持 简单的数学运算,但是可以通过其他命令来实现,例如expr。 expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加:
注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。
完整的表达式要被 ` 包含,注意不是单引号,在 Esc 键下边。
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a==$b ]。
Shell的流转表达式 if else elseif
if的语法结构
以if 开头 fi 结尾
if elseif else语法结构
流转表达式中的关系型运算符
Shell脚本中的关系型运算符只支持数字不支持字符串,除非你的字符串是数字。
Shell的循环
for循环格式
格式1:
for i in list; do
echo $i;
done
格式2:
for((i=1;i<=10;i++));do
echo $i;
done
格式3:
awk 'BEGIN{for(i=1; i<=10; i++) print i}'
格式4:
for i in {1..10};do
echo $i;
done
当然还可以循环文件夹,输出文件夹内文件信息
for file in /proc/*;do
echo $file is file path \! ; done
while循环格式
例子:循环计算1-100的和
注意:中括号内的条件必须用空格隔开,否则会报错
跳出循环:break;跟大多数的编程语言无不同。
跳出当次循环:continue;跟大多数的编程语言无不同。
Shell的Case 语句
语法结构
case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。
匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。
如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
Shell的函数
格式为:
可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
例:
传参给函数,与函数接收参数输出
例:获取参数方式与上面脚本获取参数方式相同,传参方式也与上面脚本传参方式相同
打印输出参数值
Shell中的数组
数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。
与大部分编程语言类似,数组元素的下标由0开始。Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2 value3 ... valuen)
例:
取值:
输出结果如下
获取数组长度的方法与获取字符串长度的方法相同,例如:
输出结果为:
遍历数组
方式1:
方式2:
Shell引入外部脚本
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。Shell 文件包含的语法格式如下:
万恶的空格一定一定一定,重要的事情说三遍,要注意。真的很容易犯错。