Shell脚本入门:编写格式与执行方式
目录
Shell 脚本HelloShell入门案例
Shell 脚本文件的常用执行3种方式
Shell脚本入门:多命令处理
Shell变量:环境变量
Shell变量的介绍
Shell 系统环境变量
Shell变量:自定义变量
Shell 自定义变量介绍
Shell 自定义常量
Shell变量:特殊变量
特殊变量:$n
特殊变量:$#
特殊变量:$*、$@
特殊变量:$?
特殊变量:$$
Shell脚本文件编写规范
脚本文件后缀名规范
shell脚本文件就是一个文本文件, 后缀名建议使用 .sh
结尾
首行格式规范
首行需要设置Shell解析器的类型, 语法
含义: 设置当前shell脚本文件采用bash解析器运行脚本代码
#!/bin/bash
注释格式
- 单行注释, 语法
# 注释内容
- 多行注释, 语法
:<<!
# 注释内容1
# 注释内容2
!
shell脚本HelloShell入门案例
- 创建一个Shell脚本文件helloworld.sh,输出hello world字符串.
1、创建shell脚本文件
touch helloshell.sh
2、编辑文件
gedit helloshell.sh
3、增加shell脚本文件内容如下,并保存退出
#!/bin/bash
echo "hello shell"
4、执行脚本
sh helloshell.sh
效果
脚本文件的常用执行3种方式
-
sh解析器执行方式
语法:
sh 脚本文件
介绍: 就是利用sh命令执行脚本文件, 本质就是使用Shell解析器运行脚本文件
-
bash解析器执行方式
语法:
bash 脚本文件
介绍: 就是利用bash命令执行脚本文件, 本质就是使用Shell解析器运行脚本文件
-
仅路径执行方式
语法:
./脚本文件
介绍: 执行当前目录下的脚本文件
注意: 脚本文件自己执行需要具有可执行权限, 否则无法执行
- 执行脚本方式1-sh命令执行
sh helloshell.sh
- 执行脚本方式2-bash命令执行
bash helloshell.sh
- 执行脚本方式3-仅路径执行
添加执行权限
chmod a+x helloshell.sh
./helloshell.sh
执行shell脚本文件有哪3种方式,并说明他们的区别?
sh执行脚本文件
bash执行脚本文件
仅路径执行脚本文件
区别: 前2种是解析器直接执行不需要可执行权限, 最后一种是脚本文件自己执行需要可执行权限
Shell脚本入门:多命令处理
多命令处理介绍
就是在Shell脚本文件中编写多个Shell命令
- 已知目录/root/itheima目录,执行batch.sh脚本,实现在/yj/Shell/目录下创建一个one.txt,在one.txt文件中增加内容“Hello Shell”。
1、进入yj目录,执行创建/yj/itheima目录命令
mkdir /yj/Shell
2、创建/home/yj/batch.sh文件
touch batch.sh
3、编辑batch.sh文件,编写shell命令
gedit batch.sh
4、编写命令
命令1:创建/home/yj/Shell/one.txt文件
命令2:输出“I love Shell”字符串数据到one.txt文件中
#!/bin/bash
cd Shell # 切换到Shell目录
touch one.txt # 创建文件one.txt
echo "I love Shell">>/home/yj/Shell/one.txt #输出数据到one.txt文件中
运行脚本效果
运行batch.sh脚本文件
sh batch.sh
查看one.txt文件内容
cat Shell/one.txt
Shell变量:环境变量
Shell变量的介绍
变量用于存储管理临时的数据, 这些数据都是在运行内存中的.
变量类型
-
系统环境变量
-
自定义变量
-
特殊符号变量
系统环境变量
介绍
是系统提供的共享变量.是linux系统加载Shell的配置文件中定义的变量共享给所有的Shell程序使用
Shell的配置文件分类
1.全局配置文件 /etc/profile /etc/profile.d/*.sh /etc/bashrc
2.个人配置文件 当前用户/.bash_profile 当前用户/.bashrc
一般情况下,我们都是直接针对全局配置进行操作。
环境变量分类
在Linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变量和用户级环境变量。
系统级环境变量:Shell环境加载全局配置文件中的变量共享给所有用户所有Shell程序使用, 全局共享 用户级环境变量:Shell环境加载个人配置文件中的变量共享给当前用户的Shell程序使用, 登录用户使用
查看当前Shell系统环境变量
查看命令
env
查看Shell变量(系统环境变量+自定义变量+函数)
set
常用系统环境变量
变量名称 | 含义 |
---|---|
==PATH== | 与windows环境变量PATH功能一样,设置命令的搜索路径,以冒号为分割 |
HOME | 当前用户主目录:/root |
SHELL | 当前shell解析器类型:/bin/bash |
==HISTFILE== | 显示当前用户执行命令的历史列表文件:/root/.bash_history |
PWD | 显示当前所在路径:/root |
OLDPWD | 显示之前的路径 |
HOSTNAME | 显示当前主机名:itheima |
HOSTTYPE | 显示主机的架构,是i386、i686、还是x86、x64等:x86_64 |
==LANG== | 设置当前系统语言环境:zh_CN.UTF-8 |
环境变量输出演示
4.常用环境变量
变量名称 | 含义 |
---|---|
PATH | 命令搜索的目录路径, 与windows的环境变量PATH功能一样 |
LANG | 查询系统的字符集 |
HISTFILE | 查询当前用户执行命令的历史列表 |
Shell变量:自定义变量
自定义变量介绍
就是自己定义的变量
分类
-
自定义局部变量
-
自定义常量
-
自定义全局变量
自定义局部变量
-
介绍
就是定义在一个脚本文件中的变量, 只能在这个脚本文件中使用的变量, 就是局部变量
-
定义与使用
定义语法
var_name=value
变量定义规则
-
变量名称可以有字母,数字和下划线组成, 但是不能以数字开头
-
等号两侧不能有空格
-
在bash环境中, 变量的默认类型都是字符串类型, 无法直接进行数值运算
-
变量的值如果有空格, 必须使用双引号括起来
-
不能使用Shell的关键字作为变量名称
演示
查询变量值语法
# 语法1: 直接使用变量名查询
$var_name
# 语法2: 使用花括号
${var_name}
# 区别: 花括号方式适合拼接字符串
-
变量删除
语法
unset var_name
演示
自定义常量
介绍
就是变量设置值以后不可以修改的变量叫常量, 也叫只读变量
语法
readonly var_name
演示
自定义全局变量
父子Shell环境介绍
例如: 有2个Shell脚本文件 A.sh 和 B.sh
如果 在A.sh脚本文件中执行了B.sh脚本文件, 那么A.sh就是父Shell环境, B.sh就是子Shell环境
自定义全局变量介绍
就是在当前脚本文件中定义全局变量, 这个全局变量可以在当前Shell环境与子Shell环境中都可以使用
自定义全局变量语法
export var_name1 var_name2
案例需求
- 测试全局变量在子Shell中是否可用, 在父Shell中是否可用
案例演示
-
创建demo2.sh和demo3.sh文件
-
编辑demo2.sh, 里面定义变量VAR4并设置为全局, 并里面执行demo3.sh脚本文件
vim demo2.sh
-
编辑demo3.sh, 里面打印VAR4
vim demo3.sh
-
执行脚本文件demo2.sh, 观察打印VAR4效
-
执行脚本文件后, 在交互式Shell环境打印VAR4, 观察打印VAR4效果
结论
全局变量在当前Shell环境与子Shell环境中可用, 父Shell环境中不可用
自定义变量进行增\删\改\查
定义和修改:
var_name=value
查询:
${var_name} 或 $var_name
删除:
unset var_name
Shell变量:特殊变量
特殊变量:$n
语法
$n
含义
用于接收脚本文件执行时传入的参数
$0 用于获取当前脚本文件名称的
$1~$9, 代表获取第一输入参数到第9个输入参数
第10个以上的输入参数获取参数的格式: ${数字}, 否则无法获取
执行脚本文件传入参数语法
sh 脚本文件 输入参数1 输入参数2 ...
特殊变量:$#
语法
$#
含义
获取所有输入参数的个数
特殊变量:$*
、$@
语法
$*
$@
# 含义都是获取所有输入参数, 用于以后输出所有参数
$*
与$@
区别
1.不使用双引号括起来, 功能一样
$*和$@获取所有输入参数,格式为: $1 $2 ... $n
2.使用双引号括起来
"$*"获取的所有参数拼接为一个字符串, 格式为: "$1 $2 ... $n"
"$@"获取一组参数列表对象, 格式为: "$1" "$2" ... "$n"
使用循环打印所有输入参数可以看出区别
循环语法
for var in 列表变量
do # 循环开始
命令 # 循环体
done # 循环结束
案例需求
在demo4.sh中循环打印输出所有输入参数, 体验$*
与$@
的区别
实现步骤
编辑demo4.sh脚本文件
增加命令: 实现直接输出所有输入后参数
增加命令: 使用循环打印输出所有输入参数
演示
-
编辑demo4.sh文件
-
直接输出所有输入参数, 与循环方式输出所有输入参数(使用双引号包含
$*
与$@
)#!/bin/bash # 命令1: 打印当前脚本文件名字 echo "当前脚本文件名称:$0" # 命令2: 打印第1个输入参数 echo "第一个输入参数:$1" # 命令3: 打印第2个输入参数 echo "第二个输入参数:$2" # 命令4: 打印第10个输入参数 echo "第十个输入参数不带花括号获取:$10" echo "第十个输入参数带花括号获取:${10}" # 命令5 打印所有输入参数的个数 echo "所有输入参数个数:${#}" # 增加命令: 实现直接输出所有输入后参数 echo '使用$*直接输出:'$* echo '使用$@直接输出:'$@ # 增加命令: 使用循环打印输出所有输入参数 echo '循环遍历输出$*所有参数' for item in "$*" do echo $item done echo '循环遍历输出$@所有参数' for item in "$@" do echo $item done
-
运行观察区别
特殊变量:$?
语法
$?
含义
用于获取上一个Shell命令的退出状态码, 或者是函数的返回值
每个Shell命令的执行都有一个返回值, 这个返回值用于说明命令执行是否成功
一般来说, 返回0代表命令执行成功, 非0代表执行失败
演示
输入一个正确命令, 再输出$?
输入一个错误命令, 在输出$?
特殊变量:$$
语法
$$
含义
用于获取当前Shell环境的进程ID号
演示
查看当前Shell环境进程编号
ps -aux|grep bash
输出 $$ 显示当前shell环境进程编号
小结
常用的特殊符号变量如下
特殊变量 | 含义 |
---|---|
$n | 获取输入参数的 $0 , 获取当前Shell脚本文件名字 $1~$9 , 获取第一个输入参数到第九个输入参数 ${10} 获取10和10以上的参数需要使用花括号 |
$# | 获取所有输入参数的个数 |
$* 与 $@ | 获取所有输入参数数据 区别: 如果不使用双引号, 功能一样, 获取所有参数数据为一个字符串, 如果使用了双引号, $@ 获取的就是参数列表对象, 每个参数都是一个独立字符串, |
$? | 获取上一个命令的退出状态码, 一般;来说0代表命令成功, 非0代表执行失败 |
$$ | 获取当前shell环境进程的ID号 |
weixin_52724674: 你找到数据了吗兄弟
2401_83216212: 为什么一直显示传入test_score的x_test和y_test有一个含NAN值
2401_87014561: 没有第二张图的代码吗
呆呆兽ᕤ: 还有例3的约束条件是大于等于,应该乘-1改成小于等于吧
呆呆兽ᕤ: 例2的max不应该要乘-1吗