简单的Shell脚本

简单的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
  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值