当Linux操作系统配置完网络后,就可以使用XShell连接Linux了。
什么是shell?
Shell是C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言,脚本编程语言。
如何下载Xshell?
在中国人这里没有什么是不能破解的,去网上搜索Xshell,根据自己的需求选择版本,我使用的是Xshell 5 。它好在后续不要收费。使用Linux的IP地址连接,连接后让你登录,证明你的网络配置没有问题就可以进行命令操作了。
为什么要使用vim?
这里就要再来细讲一下vim
- 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。但是目前我们使用比较多的是 vim 编辑器。
- vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
那vim到底是个什么东西呢?
vim是从vi发展出来的一个文本编辑器,代码补全,编译及错误跳转等方便编程的功能特别丰富,被我们广泛应用。相当来说,新开发的东西肯定比老式的vi更加全面。
但是许多Xshell没有自动下载vim编辑器,这个时候我们就得使用一个命令去下载,如果已经有了会更新。
yum -y install vim*
如何使用vi/vim编写脚本?
在学习Linux的时候应该学习过这个,建议稍微了解一下Linux操作系统,在学习Xshall。我听前辈们的话就是,学习这件事要一步步来,慢点都没关系,主要要吃透,不能好高骛远。
基本上vi/vim 分为 命令模式、输入模式、底线命令模式 ,分别的作用:
命令模式
使用格式:vi 或vim命令 文件名
用户刚启动vi/vim命令,进入的就是命令模式
此状态下任何键盘敲下的动作都会被识别为命令,而不是输入字符,以下是常用命令:
- i 切换到输入模式,以输入字符。
- x 删除当前光标所在处的字符。
- shift + : 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。命令模式只有一些最基本的命令,因此仍要依靠shift+:底线命令模式输入更多命令。
输入模式
在命令模式按下i就进入了输入模式,按Esc就回到命令模式
底线命令模式
在命令模式按下Shift+:进入底线命令模式
在底线命令模式输入 w 保存文件 q退出程序 可以wq保存退出 ,!q不保存退出,按Esc随时退出底线命令模式
对于这三个模式的整体结构,可以把命令模式看成输入模式和底线命令模式的中间介,输入模式负责编写,底线命令模式负责退出。
然后就进入我们的正题,Shell脚本编程。
一.第一个Hello World ?
在学习一门语言的第一课讲的都是Hello world,这里也不例外。
首先使用文本编辑器(vi/vim)创建打开一个文件 test.sh,后缀sh代表(shell),扩展名虽然不影响文件运行,但是处于一种规范。建议这样。当你第一次直接用vim创建他是不会有颜色的,第二次编辑才会出现。
首先按下i进入文本编辑模式,输入以下
#!/bin/bash
echo "Hello world !"
#!是一个约定的标记,它会告诉系统需要由什么解释器来执行,就使用哪一种Shell
echo就相当于Java当中的System.out.println ();
然后Esc退回命令模式,按下【Shift+:】到底线命令模式 wq保存退出,然后输入以下代码执行
sh ./test.sh
二.Shell变量
在开始之前先看一下变量定义的规范:
变量名和等于号之间不能有空格
命名只能使用英文字母,数字和下划线 不能使用数字开头,中间不能有空格只能下划线,不能使用标点符号,不能使用bash关键字(help查看保留关键字),使用echo输出变量的时候建议格式${变量}
定义变量的四种方式:
1.局部变量
#! /bin/bash (头文件)
Str="Holle world"
echo ${Str}
2.外传参数
文本编辑
var=$1
echo ${var}
var1=$2
echo ${var1}查看结果文件后面填参数 空格隔开,不填就没有输出结果 $#可以查看外部传参的个数
[root@localhost shell.sh]# sh ./shell.sh a b
Holle world
a
b
3.命令变量
所有查询命令都可以作为变量的赋值
重新写一个文件里面写一个局部变量,然后回到此文件,这样就能获得另一个文件的内容
String=$(cat ./test.sh)
echo ${String}
4.环境变量
首先得配置LinuxJDK环境变量
java="$JAVA_HOME"
echo "$java"
字符串截取
length="abcdefcg"
意思是从下标为2的位置开始,包括起始元素,输出六个 这里的结果为cdefcg
echo ${length:2:6}
变量操作
readonly 变量 :将变量定义为只读
unset 变量:清除指定变量
三.数组
数组中可以定义多个值,Bash Shell只支持一维数组,初始化不用定义数组大小。与大部分编程语言一样,下标从0开始
数组用括号来表示,元素用空格隔
格式:arrays=(value value1 value2......)
创建一个数组
ayyays=(aaa bbb ccc ddd eee)
通过下标获取元素
echo ${ayyays[0]}
echo ${ayyays[1]}
echo ${ayyays[2]}
echo ${ayyays[3]}
获取数组所有元素
echo ${ayyays[@]}
echo ${ayyays[*]}
把bbb修改成ooo
ayyays[1]=ooo
echo ${ayyays[1]}
获取数组的元素个数
echo "${#ayyays[@]}"
获取下标为1的个数
echo ${#ayyays[1]}
怎么从数组元素中获取某个
echo `expr index "${ayyays[1]}" o`
四.Shell echo命令
有人会说了上面不是提过了吗,字符串输出,为什么还要拉出来讲一遍,因为这里有一个重要的点需要讲一下。
就是双引号和单引号的区别, 双引号会识别双引号内的变量、命令等等,但是单引号是直接字符串输出,不进行转义或取变量,默认是双引号。
五.Shell 基本运算符
Shell和其他编程语言一样都支持多种运算符:
- 算数运算符
- 关系运算符
- 布尔运算符
- 逻辑运算符
- 字符串运算符
- 文件测试运算符
原生的bash不支持简单的数学运算,但是通过其他命令去完成,如awk 和 expr
expr是一款表达式计算工具,使用它能完成表达式的求值操作。
算数运算符
expr规范切记:+ - * / 两边用的是反引号 *是关键字 需要进行\转义,不然会报错
算数运算符格式:var= expr ` 1 + 1 ` 条件表达式必须用空格隔开,不然会当作字符串输出
假设 变量a=10 ,b=20.
| 运算符 | 说明 | 举例 |
|---|---|---|
| + | 加法 | `expr $a + $b` 结果为 30。 |
| - | 减法 | `expr $a - $b` 结果为 -10。 |
| \* | 乘法 | `expr $a \* $b` 结果为 200。 |
| / | 除法 | `expr $b / $a` 结果为 2。 |
| % | 取余 | `expr $b % $a` 结果为 0。 |
| = | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
| == | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
| != | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
关系运算符
在学习关系运算符前先来看看Xshell流程控制语句的 if 语句,为了方便我们下面测试运算符的效果
if格式:
if [ 条件表达式 ];
then
执行语句;
fi
if else格式:
if [ 条件表达式 ];
then
执行语句;
else
执行语句;
fi
if elif格式:
if [ 条件表达式 ];
then
执行语句;
elif [ 条件表达式 ];
then
执行语句;
else
执行语句;
fi
然后开始学习逻辑运算符,运算符通常来说都是与流程控制语句搭配使用。
什么是关系运算符?
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| -eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
| -ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
| -gt | 检测左边的数是否大于右边的,如果是,则返回 true。(>) | [ $a -gt $b ] 返回 false。 |
| -lt | 检测左边的数是否小于右边的,如果是,则返回 true。(<) | [ $a -lt $b ] 返回 true。 |
| -ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。(>=) | [ $a -ge $b ] 返回 false。 |
| -le | 检测左边的数是否小于等于右边的,如果是,则返回 true。(<=) | [ $a -le $b ] 返回 true。 |
这样字看可能比较抽象,我们使用流程语句来看看。
首先定义两个变量 a=10 ,b=20
a=10
b=20
#只要把条件表达式里面的关系运算符换一下就可以了,这里就不做其他演示了
if [ ${a} -eq ${b} ];
then
echo "true";
else
echo "false";
fi
#这条的输出结果为false ,因为a不等于b布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| ! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
| -o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
| -a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
#本来两个值是不相等的,结果为ture,在前面加上!非运算就为false了
a=10
b=20
if [ ! ${a} != ${b} ];
then
echo "true";
else
#或运算只要有一个为true结果就为true a<20 b>100 显然前面的是正确的所以为true
if [ $a -lt 20 -o $b -gt 100 ] ;
then
echo "true";
else
echo "false";
fi
#与运算只要有一个为false就都为false所以把-o改成-a就变成了false逻辑运算符
| 运算符 | 说明 | 举例 |
|---|---|---|
| && | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
| || | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
&& 只要一个错就为false
| | 只要一个对就为true
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
| 运算符 | 说明 | 举例 |
|---|---|---|
| = | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
| != | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
| -z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
| -n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n "$a" ] 返回 true。 |
| $ | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
定义两个字符串变量 a=abc b=efg
#显然两个变量的字符是不相等的所以为fales ,其他的改一下之间的=就好了。
a=abc
b=efg
if [ ${a} = ${b} ];
then
echo "true";
else
echo "false";
fi#这里字符串长度不为0,返回false 其他的不做展示把 -z 换一下即可
if [ -z ${a} ];
then
echo "true";
else
echo "false";
fi
后续持续更新........