文章目录
简单的Shell脚本
Shell介绍
Shell 是一个C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理。Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。shell编程通常指的是学习shell命令语法后,利用这套语法开发脚本程序,操作、访问内核服务。而不是使用C语言去编写一个shell程序。
Shell解释器
sh:全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。sh 是UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。
csh: 全称是C shell,它是sh之后另一个广为流传的shell是由柏克莱大学的Bill Joy设计的,这个shell的语法有点类似C语言,所以才得名为C shell ,简称为csh。
Bash:全称是bash shell,它是Linux的默认shell。由GNU组织开发,是各种Linux发行版默认配置的 shell。bash兼容sh,针对sh编写的Shell代码可以不加修改地在bash中运行。
Shell变量
Shell变量类型:
shell中有3种变量:用户变量
、环境变量
、特殊变量
用户变量在编程过程中使用量最多
环境变量主要是在程序运行时需要设置
特殊变量在对参数判断和命令返回值判断时会使用
变量的定义语法:
变量名=变量值
变量的定义需遵循的规则:
(1)变量名可以由字母、数字和下划线组成,但是不能以数字开头,不能使用关键字
(2)在 Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须使用特殊命令
(3)变量用等号"=“连接值,”="左右两侧不能有空格。
(4)变量值中如果有空格,则需要使用单引号或双引号包含,如 test=“hello world!”
(5)在变量值中,可以使用转义符""。
Shell用户变量:
定义变量:变量名=变量值 注意等号两边不能有空格!
访问变量:$变量名
或 $ {变量名}
建议提取变量的时候 使用{}标识变量的边界范围
删除变量: unset 变量名
修改变量为只读变量: readonly 变量名
定义只读变量并赋值: readonly 变量名=变量值
注意:
只读变量不能够进行删除 只会随着生命周期结束而结束
对应shell命令来说 生命周期就是窗口关闭
对应shell脚本来说 生命周期就是shell执行结束
Shell环境变量:
环境变量是操作系统(Windows、Linux、Mac)在运行的时候,记录的一些关键性信息,用以辅助系统运行。当shell程序启动时,都自动设置一组变量,这组变量就是环境变量。shell中的所有命令都可以使用这些变量,环境变量可以在==/etc/profile==中设置,环境变量的名字习惯上使用大写字母。
在Linux中执行:env命令即可查看当前系统中记录的环境变量,环境变量是一种Key=Value型结构,即名称和值。
[root@node1 ~]# env
HOSTNAME=cent1
SHELL=/bin/bash
USER=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
....
我们无论当前工作目录是什么,都能执行/usr/bin/cd 这个程序就是借助环境变量中PATH这个项目的值来做到的。
自行设置环境变量:
Linux环境变量可以用户自行设置,语法:export 变量名=变量值
。
(1)临时设置
[root@node1 ~]# export BINZI=888
[root@node1 ~]# echo $BINZI
888
(2)永久生效
针对当前用户生效,配置在当前用户的: ~/.bashrc文件中
针对所有用户生效,配置在系统的: /etc/profile文件中
并通过语法:source 配置文件,进行立刻生效,或重新登录生效。
[root@node1 ~]#vim /etc/profile
在 /etc/profile文件末尾添加export BINZI=888
[root@node1 ~]#source /etc/profile #文件生效
[root@node1 ~]#env
配置内容如下:
Shell特殊变量:
我们可以在执行 Shell 脚本时,向脚本传递参数,这时候通过使用特殊变量来获取参数。
在执行Shell程序脚本时,可以向shell脚本动态传递参数。好处是某些配置属性不用写死在脚本中。
动态传递参数的方式: sh shell脚本文件 参数1 参数2
…
Shell常用的特殊变量在shell脚本内部支持接收参数并使用
变量 | 解释 |
---|---|
$0 | 当前程序的名称 |
$n | $1 表示第一个参数,$2 表示第二个参数,… |
$# | 命令行参数的个数 |
$* | 以“参数1参数2…”形式保存所有参数 |
Shell字符串:
shell中字符串定义可以使用单引号、可以使用双引号、也可以不使用引号,这里推荐使用双引号定义字符串,方便在字符串中实现变量的提取操作。
[root@node1 ~]# name=zhangsan
[root@node1 ~]# echo $name
zhangsan
[root@node1 ~]# name1='lisi'
[root@node1 ~]# echo $name1
lisi
[root@node1 ~]# name2="wangwu"
[root@node1 ~]# echo $name2
wangwu
[root@node1 ~]# echo my name is ${name}
my name is zhangsan
[root@node1 ~]# echo 'my name is ${name}'
my name is ${name}
[root@node1 ~]# echo "my name is ${name}"
my name is zhangsan
注意:双引号括起来的内容有"$"等都拥有特殊含义 ,单引号括起来的内容都是普通字符。
Shell反引号`的使用:
(1)反引号:`
(2)功能:执行反引号里面的命令。
#需求:把date命令执行的结果赋值给nowtime变量
[root@node1 ~]# date
2024年 07月 17日 星期三 21:57:31 CST
#如果没有反引号 理解为字符串
[root@node1 ~]# nowtime=date
[root@node1 ~]# echo $nowtime
date
#使用反引号 理解为执行命令 把命令的结果进行赋值
[root@node1 ~]# nowtime=`date`
[root@node1 ~]# echo $nowtime
2024年 07月 17日 星期三 21:58:33 CST
Shell命令、Shell脚本:
介绍:
(1)命令、脚本本质上都是属于shell;
(2)shell命令倾向于在linux命令行中使用,适合逻辑简单场景;
(3)shell脚本倾向于在文件中编写,适合复杂逻辑处理。
#以shell命令执行
[root@node1 ~]# echo 'hello shell'
hello shell
#编写shell脚本 执行脚本
[root@node1 ~]# vim hello.sh
#!/bin/bash
echo "hello shell"
[root@node1 ~]# sh hello.sh
hello shell
注意:(1)shell脚本一般以==.sh结尾==
(2)文件第一行一般为==#!/bin/bash==
Shell脚本执行方式:
方式一:相对路径sh执行
格式: sh
脚本
注意: 需要进入脚本的所在工作目录,然后使用对应的sh命令来执行脚本,
这种执行方式,脚本文件不需要具有可执行权限。
方式二:相对路径./执行
格式: ./
脚本
注意: 需要先进入到脚本所在的目录,然后使用 ./脚本方式执行,
这种执行方式,必须保证脚本文件具有可执行权限。
方式三:绝对路径执行
格式: /绝对路径/
脚本
注意: 需要使用脚本的绝对路径中执行,指的是直接从根目录/到脚本目录的绝对路径,
这种执行方式,必须保证脚本文件具有可执行权限。
Shell脚本案例一
创建一个test1.sh脚本文件,要求此脚本内先定义一个字符串变量str并赋值test666,然后打印该字符串
最后保存并执行此脚本。
# 创建脚本
[root@node1 ~]# vim test1.sh
#!/bin/bash
str=test666
echo $str
#sh命令执行脚本
[root@node1 ~]# sh test1.sh
test666
#授予脚本执行权限
[root@node1 ~]# chmod +x test1.sh
# 相对路径: ./脚本执行
[root@node1 ~]# ./test1.sh
test666
# 绝对路径:带根目录执行
[root@node1 ~]# /root/test1.sh
test666
注意:
(1)shell脚本后缀名没有要求,通常以.sh结尾。
(2)在shell中除了第一行的#表示特殊格式外,其他地方的#符号一般表示注释。
(3)#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。
(4)相对路径方式如果不加./直接执行脚本,默认去系统环境变量中查找。
Shell脚本案例二
1.编写一个脚本文件test2.sh,在里面使用之前学习的特殊变量分别获取当前脚本文件名称,传入参数个数并分别获取对应参数内容。
2.执行test2.sh脚本文件,传入3个参数,分别为:刘向阳,23,男。
3.使用sh命令方式执行test2.sh脚本文件
[root@node1 ~]# vim test2.sh
#!/bin/bash
echo "当前脚本文件名称为:$0"
echo "传入的第一个参数为:$1"
echo "传入的第一个参数为:$2"
echo "传入的第一个参数为:$3"
echo "传入的参数一共$#个"
echo "所有参数为:$*"
[root@node1 ~]# sh test2.sh 刘向阳 23 男
当前脚本文件名称为:test2.sh
传入的第一个参数为:刘向阳
传入的第一个参数为:23
传入的第一个参数为:男
传入的参数一共3个
所有参数为:刘向阳 23 男