Shell 介绍
- shell是一个用c语言编写的程序,他被称为用户使用linux的桥梁
shell即是一种命令语言,又是一种程序语言
shell脚本是一种为shell编写的脚本程序
Shell运行环境和运行方式
- shell编程和java,python等一样,只需要一个文本编辑器和解释工具即可
linux的shell太多,常见的有:
Bourne Shell (/usr/bin/sh或/bin/sh) 在linux下:/bin/sh
Bourne Again Shell (/bin/bash) 在linux下:/bin/bash
C Shell (/usr/bin/csh) 在linux下: /bin/tcsh
K Shell (/usr/bin/ksh) 是c shell 的超集
Shell for Root (/sbin/sh)
其中linux自带有:/bin/bash 、/bin/sh、/bin/tcsh、/bin/csh 等以上的集中都是交互式的
bash易用和免费。Bash在日常工作中被广泛使用
bash也是大多数Linux系统默认的Shell
#!/bin/sh等价于#!/bin/bash
- 一个hello world 实例:
编辑第一个shell脚本
vim /home/shell/firstshell
#!/bin/bash
echo 'hello world'
保存退出即可
#!/bin/bash 是一种约定的标记,他告诉系统该脚本用什么解释器执行,即是那一类脚本
怎么注释: 除了(#!/bin/bash)这个#号不是注释外,其余几乎都是注释
- 运行方式
a、可执行权限运行:
chmod a+x /home/shell/first.sh //使脚本具有执行权限
/home/shell/first.sh //执行脚本
b、加解释器运行:
/bin/bash /home/shell/first.sh
不用赋予脚本执行权限;
不用在脚本第一行加 #!/bin/bash ,加了也是外面的生效
Shell的变量
- 变量定义
定义变量时,变量名不加 $ 符 如:name="1511A"
注意:变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:
首个字符必须为字母{a-z,A-Z}
中间不能有空格 ,可以使用下划线 (_)
不能使用标点符号
不能使用bash里的关键字 (可用help命令查看保留关键字)
- 变量的赋值
显式的直接赋值(可以重复为变量赋值):
name="你好"
用语句给变量赋值,如:
name='expr 2 + 2'
以上语句将2+2的值给变量
注意:其中的空格,必须要有
- 使用变量(linux中的使用变量必须加$)
使用一个定义过的变量,只要在变量名前面加$符号即可,如:
echo $name
echo ${name}
变量名外面的花括号是可选的,加不加都行
加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
name="17.1A"
echo "qianfeng${name}班"
- 只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
下面的例子尝试更改只读变量,结果报错:
- 删除变量
一种方式是直接将整行赋值命令删除掉
第二种是在赋值语句下面加上
unset +变量名
- 变量类型:(局部变量(常用)、环境变量、shell变量)
运行shell时,会同时存在三种变量:
1)局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
2)环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行,必要的时候shell脚本也可以定义环境变量
3)shell变量 shell变量是由shell程序设置的特殊变量
shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
- shell字符串
字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号
单引号
str='this is a string'
注意:单引号里的任何字符都回原样输出,单引号字符串中的变量是无效的;
单引号字符串中不能出现单引号(对单引号使用转义符后也不行)
双引号
class=1701A
str="this is \"$class\"!\n"
双引号的优点: 双引号里可以有变量,双引号里可以出现转义字符
反引号
shell中加上反引号会被认为是一个命令
shell中写入
class=`date`
echo "class is ${class}"
执行shell文件会输出 class is +当前当前时间
拼接字符串
your_name="haha"
greeting="hello,$your_name!"
echo greeting
获取字符串长度
string="abcdef"
echo ${#string} //输出 6
获取子字符串
string=''this is class''
echo ${string:1:3} //表示从字符串的第二个字符开始一共取三个 输出为his
查找子字符串
查找字符 " i 或 s" 的位置
string="this is a class"
echo `expr index "$string" is` //输出3 (注意""不能去掉)
注意:以上脚本中 " ` " 是反引号,而不是单引号
Shell数组
- bash支持一维数组(不支持多维数组),并且没有限定数组的大小,数组元素的下标由0开始
获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0
- 定义数组
在shell中,用括号来表示数组,数组元素用 "空格" 符号分开,定义数组的一般形式为:
数组名=(值1 值2 ..... 值n)
例如: array_name=(value0 value1 value2 value3 value4)
在shell文件中定义 arr1=(1 2 3 4 'hello' 'world')
echo $(arr1[*]) //打印数组所有的值 或者 * 换为@符
echo $(arr1[1]) //打印数组的第二个值
echo $(#arr1[*]) //打印数组的长度
修改shell文件权限为744 执行后会输出
Shell注释
以 "#"开头的行就是注释,会被解释器忽略。(除第一行的解释器以外)
sh里没有多行注释,只能每一行加一个#号
注:如果在开发中遇到大量代码需要临时注释起来,过一会又取消注释,可以把这一段代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到和注释一样的效果
Shell基本运算符
shell中运算符包括:数学运算符,关系运算符,布尔运算符,字符串运算符,文件运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr, expr最常用
expr是一款表达式计算工具,使用他能完成表达式的求值操作。
例如两个数相加(注意使用的是反引号 ` 而不是单引号 ' ):
- 数学运算符
#!/bin/bash
a=20
b=10
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b` //乘号需要转义符
echo `expr $a / $b`
echo `expr $a % $b`
- 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
假定变量 a 为 10, 变量 b 为 20
- 布尔运算符
- 字符串运算符
- 文件测试运算符
实例
Shell条件控制
- if 条件分支判断
- for循环判断
例如
会打印出 1 2 3 4 5
shell文件中写入如下语句 seq 表示从1到20循环递增 执行文件后会循环输出1到20
shell中编写循环创建文件
- while
循环打印1 到20 i=`expr $i + 1` 可以换成 let "i++"
- case in
case:匹配:(必须有in,一个模式结束必须用双 ;; 号,esac整个case(case的反转)结束标识)
- 例子
Shell中的方法
- 定义
- 实例
带返回值的
带参数的 (参数位数大于两位数要加上花括号,不加就会输出原值)
例如下面的第一个第十个参数会输出10 第二个第十个参数才会输出900
通过命令端传递参数 定义wpar.sh文件
特殊字符处理参数
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$@ 与 $* 相同,但是使用时加引号,并在引号中返回每个参数
Shell文件引入
和其它语言一样,shell也可以包含外部脚本,这样可以很方便的封装一些公用代码作为一个独立的文件
shell文件包含的语法格式如下:
. filename //注意点号(.)和文件名中间有一空格
或
source filename
实例:
Shell中脚本的调试
- shell的语法检测
1.shell语法检测
sh -n ./test.sh (sh是/bin/sh 是系统提供的可执行脚本)
例如: 在test.sh中写入
因为for循环没有写 do
所以执行 sh -n ./test.sh 会检测出脚本中的错误
2.shell的普通调试 (当脚本比较大的时候不建议使用)
sh-x ./test.sh
3.shell的中断调试:(在shell中添加一个睡眠,保证可以有时间中断调试 sleep 3 睡眠3秒执行下一语句)
中断调试 在脚本中写 sleep 3 ,执行脚本文件时 按ctrl+Z会停止脚本执行来观察结果,然后再按fg键继续调试即可(先按 f 再按 g 键)
4.使用调试工具 -bashdb
功能:类似于GDB的调试工具,可以完成对shell脚本的断点设置,单步执行,变量观察等许多功能
场合:脚本比较大时,通过 -x 参数调试时以不方便时
用法: bashdb --debug 脚本名
或者 bashdb -c script.sh
说明:
bashdb常用命令: