简介
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。Shell 是用C语言编写的程序,其可以对Linux系统进行交互,可以方便用户对于一些重复的行为进行编写,然后对linux中的某些行为进行操作。(有点像是windows中的bat文件)
Shell是一个命令解释器,它为用户提供了一个向Linux内核发送的请求以便运行的程序的界面系统程序,毕竟用户很难用计算机语言与计算器内核进行交互(用0或者1进行数据表达)。
shell 格式要求
shell文件名规范
Shell 脚本都是以.sh后缀结尾,但是linux没有文件格式一说,比如test.sh 可以运行,你写成test也可以运行,但是为了方便对这个文件的作用了解,一般都会加上.sh 后缀。
对Shell文件的命名,一般最后直观写,也是方便知道这个sh文件的作用,最好不要用a,b,c等命名,比如用:install_python.sh等,这样很直观的看出这个sh文件本身就是一个插入python的脚本。
shell文件的输入格式
具体格式如下:
#!/bin/bash
#Author: xxx
#Created Time: xxxxx
#Script Description: xxx
符号 | 解释 |
---|---|
#! | 特殊写法(记住),例如#!/bin/bash 指定该脚本是运行解析由/bin/bash来完成的 |
# | 单行注释 下面三行是为这个sh进行的详细描述(不写也能运行,不过一般为了明白都写) |
:<<! 多行注释内容 ! | 多行注释的符号,看着很奇怪,不过记住就行,毕竟我们只能尊重他人规范 |
shell 变量
shell 变量分为:系统变量和用户自定义变量。
-
系统变量:
-
H O M E , HOME, HOME,SHELL,$USER等,用echo可以打印其值,比如 :echo $USER
-
如果想看shell中所有变量可以使用:set
-
-
自定义变量
-
定义的格式很简单:变量名(一般习惯用大写字母)=值,比如:A=100;
注意:1:= 号两侧不可以有空格,不然这个声明变量不会成功,同样运行sh文件的时候不会报错;
2:命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。中间不能有空格,可以使用下划线 _。不能使用标点符号。不能使用bash里的关键字(可用help命令查看保留关键字)。
-
撤销变量:unset 变量
-
声明只读变量:readonly变量,只读变量不能使用unset 撤销
-
演示一下声明变量
# 第一步:如果有需要先创建一个存放shell文件的文件夹
# 第二步:cd 到目标文件夹 vim 文件名.sh
#输入下面信息
一般新建的sh文件,是没有执行权限的,所以 执行 sh 文件有两种方式。
-
没有执行权限
sh 路径/文件.sh (如果在当前路径下的话 也可以直接 sh 文件.sh)
-
有执行权限
#如果没有可以直接赋予执行权限 chmod o+u 文件.sh # 然后可以执行 路径/文件.sh (如果咋当前路径的话 ./文件.sh)
上面执行结果
可以看出如果声明变量的时候如果有空格,那么系统不会识别这个变量。
调用变量的时候需要前面有一个 符 号 。 如 果 字 符 串 + 符号。如果字符串+ 符号。如果字符串+变量的话,可以用双引号包裹,但是如果用单引号的话,直接就是一个字符串。
补充:
如果将命令返回值赋值给变量。有两种写法:比如将其date命令赋值给A。
#使用的反引号,也就是数字1键左侧带有波浪线的那个键
A=`DATE`
#用$()
A=$(date)
运行结果
unset释放数据,的效果如何 ?
执行结果
可以看出释放后,就没有这个数据了,所以命令窗口只是输出一行空行。
readonly格式如下:
readonly A=2
#如果使用unset 释放A会报错,同时readonly声明的变量无法重新赋值。
设置环境变量
这个变量一般配置在 文件: 最常见的是在/etc/profile文件中进行配置。
基本语法:
-
打开配置文件,然后加上:export 变量名=变量值
这一步骤是将shell变量输出为环境变量(全局变量)
-
source 配置文件
修改了变量,但是不会立即生效,所以需要进行刷新让其生效
-
测试
echo $变量
前面配置jdk的时候,就这样使用的如图:
位置参数变量
使用shell脚本时,有时候会为shell文件传递一些参数,类似与调用方法给方法形参进行赋值的感觉。
./test.sh 参数1,参数2……
而在shell文件中可以得到参数1,参数2……的参数信息。
而shell命令也有位置参数变量,为大家解决了这个问题。
位置参数 | 意思 |
---|---|
$n | n为数字,$0的意思就是命令本身。$1- 9 代 表 第 一 到 第 九 个 参 数 , 如 果 是 10 个 以 上 参 数 就 需 要 用 大 括 号 包 含 比 如 “ 9代表第一到第九个参数,如果是10个以上参数就需要用大括号包含比如“ 9代表第一到第九个参数,如果是10个以上参数就需要用大括号包含比如“{10} |
$* | 这个表示得到所有的参数,不过把所有的参数看成一个整体 |
$@ | 这个变量也是得到所有的参数,不过这个是将参数区分对待 |
$# | 表示参数的个数 |
这个如果只看上表中的描述可能会疑惑,所以现在进行还打吗演示。
执行后输入如下:
其中看着 ∗ 和 *和 ∗和#输出没有区别,后面聊循环的时候,就会了解其分开和整体的意思。
预定义变量
这种变量其实有点像是系统变量(环境变量),不过其无法进行修改,是设计shell命令的时候直接定义好的,而我们直接拿来用即可。
预定义变量 | 意义 |
---|---|
$$ | 当前进程的进程号(PID) |
$? | 最后一次执行的命令的返回状态。如果这个变量的值为 0,则证明上一条命令正确执行;如果这 个变量的值为非 0 (具体是哪个数由命令自己来决定),则证明上一条命令执行错误 |
$! | 后台运行的最后一个进程的进程号(PID) |
不在编辑sh文件直接在控制台演示了,如下: