Shell编程
一、Shell概念介绍
1、认识Shell
Shell解析器:解析Shell脚本,查看:
cat /etc/shells
CentOS默认的解析器是**bash**,打印系统默认的Shell解析器
echo $SHELL
①、Shell是什么
是命令,类似Windows的dos命令;
又是一门程序设计语言,里面含有变量、函数、逻辑控制语句等
②、Shell脚本是什么
Shell脚本是一个文本文件,里面可以编写Shell命令或进行编程,形成一个可重用执行的脚本文件
③、Shell脚本的作用
通过Shell编程提高对Linux系统的管理工作效率
④、Linux系统默认的Shell解析器
/bin/bash
2、编写、执行Shell脚本
①、Shell脚本编写规范
-
文件后缀名以
.sh
结尾 -
首行需要设置shell解析器类型,如下:
#!/bin/bash
含义:设置当前shell脚本文件采用bash解析器
-
注释:
-
单行注释
# 注释内容
-
多行注释
:<<! 注释行1 注释行2 !
-
②、Shell脚本HelloWorld
-
编写HelloWorld脚本文件
touch HelloWorld.sh vim HelloWorld.sh
a
进入编辑模式,HelloWorld.sh内容如下#!/bin/bash echo "Hello,World"
:wq
保存 -
执行脚本文件HelloWorld.sh
-
shell解析器执行
sh HelloWorld.sh
-
bash解析器执行
bash HelloWorld.sh
-
仅路径执行:需要脚本文件具有可执行权限
# 添加可执行权限 chmod a+x HelloWorld.sh # 自我执行,前面的./代表当前路径 ./HelloWorld.sh
-
三种执行方式的区别:
sh或bash执行通过直接使用shell解析器执行,不需要脚本文件具有可执行权限;
仅路径方式自我执行脚本文件,需要可执行权限
3、多命令处理
需求:
已知目录/root/feng目录,执行batch.sh脚本,实现在/root/feng/目录下创建一个one.txt文件,在one.txt文件中增加内容"Hello, Shell"。
实现:
# 创建feng目录
mkdir feng
# 创建并编辑batch.sh脚本文件
vim batch.sh
batch.sh内容:
#!/bin/bash
touch /root/feng/one.txt
echo "Hello, Shell" >> /root/feng/one.txt
输出字符串数据到文件:
echo "字符串" >> 文件
# 执行batch.sh
sh batch.sh
# 查看one.txt文件是否生成
ls -l /root/feng/
# 查看one.txt文件内容
cat /root/feng/one.txt
二、Shell变量
1、环境变量
①、 系统环境变量是什么?
是系统提供的环境变量,通过加载shell配置文件中的变量数据,共享给shell程序使用
②、环境变量的分类
-
系统及环境变量
shell环境加载全局配置文件中定义的变量
-
用户级环境变量
shell环境加载个人配置文件中定义的变量
③、env和set的区别
- env:查看系统环境变量
- set:查看系统环境变量、自定义变量、函数
④、常用的环境变量
变量名称 | 含义 |
---|---|
PATH | 存放命令的目录路径,与Windows的环境变量PATH一样 |
LANG | 查询系统的字符集 |
HISTFILF | 查询当前用户的历史执行命令列表 |
2、自定义局部变量
① 自定义局部变量
-
定义自定义局部变量
var_name=value # 注意=前后不要有空格
-
使用自定义局部变量
# 直接使用 echo $var_name # 字符串拼接使用 echo my name is ${var_name}123
-
删除自定义局部变量
unset $var_name
② 自定义常量(只读变量)
-
定义只读变量:(不可修改值)
readonly var_name
③ 自定义全局变量
父子Shell环境:
有两个Shell脚本文件A.sh和B.sh
在A.sh中执行了B.sh的脚本文件,就称A.sh为父Shell环境,B.sh为子Shell环境。
自定义全局变量:
在父Shell环境中定义全局变量,子Shell环境也能使用
自定义全局变量语法:
export var_name1 var_name2
案例:
- 创建2个脚本文件demo1.sh和demo2.sh
- 编辑demo1.sh
- 命令1:定义全局变量VAR_NAME
- 命令2:执行demo2.sh的脚本文件
- 编辑demo2.sh
- 输出全局变量VAR_NAME
- 执行demo2.sh文件
#1. 创建2个脚本文件demo1.sh和demo2.sh
touch demo1.sh demo2.sh
#2. 编辑demo1.sh
vim demo1.sh
demo1.sh内容
#!/bin/bash
#- 命令1:定义全局变量VAR_NAME
export VAR_NAME="GO Spurs GO"
#- 命令2:执行demo2.sh的脚本文件
sh demo2.sh
demo2.sh内容
#!/bin/bash
#- 输出全局变量VAR_NAME
echo $VAR_NAME
执行demo1.sh: sh demo1.sh
④ 自定义变量总结
1、定义和修改:var_name=value
2、查询或使用:${var_name}
或$var_name
3、删除:unset varname
3、特殊变量
$n
:用于接收脚本文件执行时传入的参数$#
:获取所有输入参数的个数。$*
:获取所有输入参数$@
:获取所有输入参数$?
:获取上一个shell命令执行的退出状态码,或者是函数的返回值$$
:获取当前Shell环境的id号
$n
- $0:用于获取当前脚本文件的名称
- $1~$9:代表第1个到第9个输入参数
- ${数字}:代表第10个及以上的输入参数
$*
和$@
的区别:
- 不使用双引号引起来,功能一样
获取所有的输入参数,格式为:$1 $2 ...
- 使用双引号引起来
$*
:获取的所有参数拼接成一个字符串,格式为:"$1 $2 ... $n"
$@
:获取一组参数列表对象,格式为:"$1"
"$2"
…"$n"
执行脚本文件传入参数
sh 脚本文件 参数1 参数2 ···
循环语法:
for var_name in 列表变量
do # 循环开始
echo $var_name # 循环体
done # 循环结束
需求:
创建demo.sh, 打印脚本文件名字,第一个参数,第二个参数,第十个参数,所有参数个数,所有输入参数、逐行打印参数。
实现:
- 创建demo.sh:
vim demo.sh
- demo.sh
#!/bin/bash
# 打印脚本名字
echo 打印脚本名字:$0
# 打印第一个参数
echo 打印第一个参数:$1
# 打印第二个参数
echo 打印第二个参数:$2
# 打印第十个参数
echo 打印第十个参数(不带花括号):$10
echo 打印第十个参数(带花括号):${10}
# 打印所有参数个数
echo 打印所有参数个数:$#
# 打印所有输入参数
echo 打印所有输入参数:"$*"
# 遍历参数列表
echo 遍历参数列表:
for item in "$@"
do
echo $item
done
- 执行demo.sh:
sh demo.sh 一 二 三 四 五 六 七 八 九 十
- 查看上一个shell命令的执行结果:
echo $?
- 查看当前Shell环境的id号:
echo $$