1 代码规范
[root@localhost ~]# cat HelloWorld.sh
#!/bin/bash
#This Line is a comment
echo "Hello World"
第一行永远是以“#!”开头的,这是一个脚本开始的标记,它是在告诉系统执行这个文件需要使用某个解释器,后面的/bin/bash就是指明了解释器的具体位置。
第二行同样是以“#”开头的,但是这里是一个注解。脚本中所有以“#”开头的都是注解
2 文件命名规范
文件名.sh
3 使用流程
3.1 创建sh文件
touch/vim xxx.sh
3.2 编写sh代码
3.3 运行脚本及执行权限
3.3.1 bash这个脚本
如果直接在脚本目录bash这个脚本,不需要第一行的#!因为直接bash一个文件就是指定了使用Bash Shell来解释脚本内容。
tys@tys-virtual-machine:~/study/shellStudy$ bash test.sh
hello world
3.3.2 ./ 给脚本可执行权限
使用“./”来运行,它代表运行的是当前目录下的HelloWorld.sh脚本,如果采用这种方式而脚本没有可执行权限则会报错。
tys@tys-virtual-machine:~/study/shellStudy$ ./test.sh
-bash: ./test.sh: 权限不够
如果希望该脚本能成为默认的系统命令,简单地将该脚本复制到任一系统$PATH变量所包含的目录中,同时赋予可执行权限,下次运行的时候只需要直接输入该命令即可。也支持用Tab键补全命令。
4 Shell的内建命令
所谓Shell内建命令,就是由Bash自身提供的命令,而不是文件系统中的某个可执行文件。
例如,用于进入或者切换目录的cd命令,虽然我们一直在使用它,但如果不加以注意很难意识到它与普通命令的性质是不一样的:该命令并不是某个外部文件,只要在Shell中你就一定可以运行这个命令。打个比方,就像使用语言互相沟通是人类与生俱来的能力,但是我们有时却需要使用移动电话来进行远距离的沟通,那么人类本身具备的语言能力就是“内建”的能力,而移动电话却是一个外部的工具。
$PATH变量包含的目录中几乎聚集了系统中绝大多数的可执行命令。
通常来说,内建命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘I/O,还需要fork出一个单独的进程来执行,执行完成后再退出。而执行内建命令相当于调用当前Shell进程的一个函数。
4.1 如何确定内建命令:type
判断一个命令是不是内建命令只需要借助于命令type即可,如下所示:
type cd
不要试图用脑子记住所有的命令,这不可能也不需要。
4.2 echo 输出
4.3 降低单次循环的速度 sleep
5 Shell配置文件、环境变量
5.1 全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
5.2 个人配置文件
5.3 查看当前Shell系统环境变量
env
5.4 查看当前Shell变量(系统环境变量+自定义变量+函数)
set
6 变量
6.1 变量名
由数字、字母、下划线组成。
不能由数字开头。
不能用Shell的关键字作为变量名。
6.2 赋值
赋值时等于号=紧贴变量名,不能有空格
6.3 数值类型
默认变量类型都是字符串
6.4 使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}
变量值有空格则必须用双引号“”
使用井号+花括号#{}区分变量???
6.5 局部变量
6.5.1 定义
局部变量就是定义在一个脚本文件中的变量,只能在这个脚本文件中使用的变量。
6.6 全局变量
6.6.1 Shell父子脚本环境
假如有脚本A.sh和B.sh,在A.sh执行了B.sh,即有命令:
bash B.sh
则A是父脚本,B是子脚本
6.6.2 设置全局变量
export var_name
### 6.7 常量/只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
```bash
var_name="https://www.runoob.com"
readonly var_name
6.7 删除变量
unset variable_name
6.8 字符串
6.8.1 索引
第一个字符的索引值为 0。
6.8.2 单、双引号
双引号内可用变量
单引号内全是字符
6.8.3 获取字符串长度
主要变量名前要加#井号
string="abcd"
echo ${#string}
# 输出 4
6.8.4 截取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4}
# 输出 unoo
6.8.5 查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io`
# 输出 4
注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。
6.8.6 拼接字符串
your_name="runoob"
6.8.6.1 使用双引号拼接:
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
输出结果为:
hello, runoob ! hello, runoob !
6.8.6.2 使用单引号拼接:
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
输出结果为:
hello, runoob ! hello, ${your_name} !
6.9 数组
6.9.1 定义
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
#数组名 =(值1 值2 ... 值n )
array_name=(value0 value1 value2 value3)
下标 由 0 开始编号,类似于 C 语言,数组元素的。
6.9.2 读取
获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
6.9.2.1 读一个元素值
读取数组元素值的一般格式是:
# ${数组名 [下标]}
valuen=${array_name[n]}
6.9.2.2 读全部元素值
使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
6.9.3 获取数组的元素个数(数组长度)
获取数组长度的方法与获取字符串长度的方法相同,例如:
6.9.3.1 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
6.9.3.2 取得数组单个元素的长度
length=${#array_name[n]}
7 注释
7.1 单行注释
以 # 开头的行就是注释,会被解释器忽略。
7.2 多行注释
多行注释还可以使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
实例:
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
8 流程控制
8.1 判断
8.1.1 if … then … else … fi
注意! sh 的流程控制不可为空,如果 else 分支没有语句执行,就不要写这个 else。
语法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
8.1.2 elif
语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
8.1.3 [ … ]
注意! [ ]内要加2个空格,不可省略!
大于: -gt
小于: -lt
等于:-eq
大于等于:
小于等于:
不等于:
8.1.4 ((…))
直接使用 > 和 <