当前位置: 首页 > java >正文

Linux操作系统shell脚本

目录

一、Shell脚本语言的基本结构

1、Shell脚本的用途:

2、 Shell脚本基本结构:

3、 创建Shell脚本过程

4、 脚本注释规范

5、第一个脚本

6、 执行脚本

7、脚本错误

二、Shell脚本语言的变量用法详解

1、变量

2、 变量类型

3、 Shell中变量命名法则

4、 变量定义和引用

5、 环境变量

6、只读变量

7、位置变量

8、 退出状态码变量

三、 Shell字符串详解

1、Shell字符串拼接

2、Shell字符串截取

四、Shell脚本语言的运算

4.1 算数运算

4.2 Bash中的算术运算

4.2 实现算术运算

4.3 增强型赋值:

4.2 逻辑运算


一、Shell脚本语言的基本结构

1、Shell脚本的用途:

自动化常用命令

执行系统管理和故障排除

创建简单的应用程序

处理文本或文件

2、 Shell脚本基本结构:

Shell脚本编程:是基于过程式,解释执行的语言

编程语言的基本结构:

  • 各种系统命令的组合

  • 数据存储:变量,数组

  • 表达式:a+b

  • 控制语句:if、case、for、while

shell脚本:包含一些命令或声明,并符合一定格式的文本文件

格式要求:首行执行shebang机制

#声明后续语句是通过那种语言写的
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

3、 创建Shell脚本过程

使用vim创建文本文件,第一行必须包括shell声明序列:
#!/bin/bash
[root@localhost log]# echo  $SHELL
/bin/bash加执行权限,给予执行权限,在命令行上指定脚本的绝对或相对路径

加执行权限,给予执行权限,在命令行上指定脚本的绝对或相对路径

[root@localhost ~]# vim scripts1.sh
[root@localhost ~]# chmod +x script1.sh

运行脚本,直接运行解释器,将脚本作为解释器程序的参数运行

[root@localhost ~]# /root/shellScript/hello.sh 

4、 脚本注释规范

  • 第一行一般为调用使用的语言

  • 程序名,避免更改文件名为无法找到正确的文件

  • 版本号

  • 更改后的时间

  • 作者相关信息

  • 该程序的作用,及注意事项

  • 最后是各版本的更新简要说明

#!/bin/bash
3auth:Mr  yuetangbinghua
#Use:列出系统中的普通文件
Date:2026年——06——04
#version: 1.0
cd /home
。/script1.sh
find /home -type f

5、第一个脚本

[root@localhost ~]# cat shell/hostname.sh 
#!/bin/bash
echo "My hostname is `hostname`"
echo "Time is `date +'%F %T'`"
[root@localhost ~]# chmod +x shell/hostname.sh
[root@localhost ~]# shell/hostname.sh

6、 执行脚本

1、增加执行权限,执行脚本时会创建一个子shell,不影响现有的shell环境

chmod +x sh
./sh
/root/shellScript/sh

2、使用 . 或者source,执行脚本时不会创建一个子shell,会影响现有的shell环境

source sh
. sh

不要使用(点)方式执行脚本

7、脚本错误

  • 语法错误,会导致后续的命令不继续执行,可以用bash -n shellname检查错误

  • 命令错误,后续的命令还会继续,可以使用bash -x shellname检查

  • 逻辑错误,只能使用bash -x进行观察

二、Shell脚本语言的变量用法详解

1、变量

变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据

2、 变量类型

变量类型:

内置变量:如PS1,PATH,UID,HOSTNAME,HISTSIZE

用户自定义变量

预定义变量

位置变量

不同的变量存放的数据不同,决定了以下:

  1. 数据存储方式

  2. 参与的计算

  3. 表示的数据范围

变量数据类型:

  • 字符串

  • 数值:整型,浮点型(小数)、bash不支持浮点数

3、 Shell中变量命名法则

  • 不能使用程序中的保留字,如:if,for

  • 只能使用数字,字母及下划线,且不能以数字开头

  • 见名思意,用英文名字,并体现真正含义

  • 统一命名规则:驼峰命名法

  • 全局变量名大写

  • 局部变量小写

  • 函数名小写

    [root@localhost ~]# a=1
    [root@localhost ~]# echo  $7[root@localhost ~]# ls /etc/  /home/
    

  • [root@localhost ~]# a=2
    [root@localhost ~]# n1=1
    [root@localhost ~]# userName=list
    [root@localhost ~]# env
    [root@localhost ~]# export  a-1
    bash: export: `a-1': 不是有效的标识符
    [root@localhost ~]# bash
    [root@localhost ~]# echo  $a[root@localhost ~]# exit
    exit

4、 变量定义和引用

变量的生效范围(变量作用域)

  • 普通变量:生效范围为当前shell进程;对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效

  • 环境变量:生效范围为当前shell进程及其子进程

  • 本地变量:生效范围为当前shell进程中某代码片段,通常指函数

[root@localhost ~]# rs2=./*
[root@localhost ~]# echo  $rs2
./公共 ./模板 ./视频 ./图片 ./文档 ./下载 ./音乐 ./桌面 ./anaconda-ks.cfg ./hexiuxiu.md ./hutao ./ifcfg-ens160 ./initial-setup-ks.cfg ./liyue ./scripts1.sh ./wangziyi ./yunji

注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存。

变量引用:

$name
${name}

弱引用和强引用:

  • “$name”:弱引用,其中的变量引用会被替换成为变量值

  • ‘$name’:强引用,其中的变量引用不会被替换成变量值,而保持原字符串

删除变量

[root@localhost ~]# set  |  wc  -l
3106
[root@localhost ~]# unset  str1
[root@localhost ~]# echo  $str1[root@localhost ~]# str1=wang
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# echo  $str2
$str1
[root@localhost ~]# echo  $str3
yueliang
[root@localhost ~]# str4=$str1444
[root@localhost ~]# echo  $str4[root@localhost ~]# str4=${str1}444

利用变量实现动态命令

[root@localhost ~]# CMD=hostname
[root@localhost ~]# $CMD
localhost.localdomain
[root@localhost ~]#

5、 环境变量

环境变量:

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量。

  • 一旦子进程修改了从父进程继承的变量,将会传递新的值给孙子进程

  • 一般只在配置文件中使用,在脚本中较少使用

[root@localhost ~]# vim shell/father.sh 
#!/bin/bash
NAME=father
echo "father.sh:NAME=$NAME"
echo "fatther is PID=$BASHPID"
shell/son.sh[root@localhost ~]#vim shell/son.sh
#!/bin/bash
echo "son.sh:NAME=$NAME"
NAME=son
echo "son.sh:NAME=$NAME"
echo "son.sh PID is $BASHPID"
echo "son.sh father pid is $PPID"
sleep 100[root@localhost ~]#chmod -R +x shell/*[root@localhost ~]# ./shell/father.sh 
father.sh:NAME=father
fatther is PID=12053
son.sh:NAME=
son.sh:NAME=son
son.sh PID is 12054
son.sh father pid is 12053

6、只读变量

只读变量:只能声明定义,但后续不能修改和删除

7、位置变量

位置变量:在Bash Shell中内置的变量,在脚本代码中调用命令行传递给脚本的参数

[root@localhost ~]# vim shell/ARG.sh
#!/bin/bash
echo "1st arg is $1"
echo "2st arg is $2"
echo "3st arg is $3"
echo "4st arg is $4"
echo "The number of are is $#"
echo "All args are $*"
echo "All args are $@"
echo "The scriptname is `basename $0`"
[root@localhost ~]# chmod +x shell/ARG.sh 
[root@localhost ~]# shell/ARG.sh {1..10}
1st arg is 1
2st arg is 2
3st arg is 3
4st arg is 4
The number of are is 10
All args are 1 2 3 4 5 6 7 8 9 10
All args are 1 2 3 4 5 6 7 8 9 10
The scriptname is ARG.sh

8、 退出状态码变量

进程执行后,将使用变量 ? 保存状态码的相关数字,不同的值反应成功与失败, ?保存状态码的相关数字,不同的值反应成功与失败, ?保存状态码的相关数字,不同的值反应成功与失败,的取值范围为[0,255]

[root@localhost ~]# ping -c 2 www.baidu.com > /dev/null 
[root@localhost ~]# echo $?
0
[root@localhost ~]# cmd
-bash: cmd: 未找到命令
[root@localhost ~]# echo $?
127
[root@localhost ~]# 

exit表示退出当前 Shell 进程,我们必须在新进程中运行 test.sh,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法取得它的退出状态了

三、 Shell字符串详解

字符串(String)就是一系列字符的组合。字符串是Shell编程中最常用的数据类型之一

字符串可以由单引号''包围,也可以由""包围,也可以不用引号,三种方式的区别

1由单引号' '包围的字符串
2由双引号" "包围的字符串
3不被引号包围的字符串#!/bin/bash
n=74
str1=c.biancheng.net$n 
str2="shell \"Script\" $n"
str3='C语言中文网 $n'
echo $str1
echo $str2
echo $str3# 运行结果
c.biancheng.net74
shell "Script" 74
C语言中文网 $n

1、Shell字符串拼接

#!/bin/bash
name="shell"
url="http://c.biancheng.net/shell/"
str1=$name$url 
str1=$name":"$url
str2="$name $url"
str3="$name:$url" 
str4="${name}Script:${url}Index.html" 

2、Shell字符串截取

Shell截取字符串通常有两种方式,从指定位置开始截取和从指定字符(子字符串)开始截取

从指定位置开始截取

1.从字符串左边开始计数

url="c.biancheng.net"
echo ${url:2:9}>结果为:bianchengurl="c.biancheng.net"
echo ${url:2} #省略length,截取到字符串末尾>结果为:biancheng.net

2.从右边开始计数

如果想从字符串的右边开始计数,那么截取字符串的具体格式如下

url="c.biancheng.net"
echo ${url:0-13:9}>结果为:biancheng 从右边数:b是第13个字符url="c.biancheng.net"
echo ${url:0-13} #省略length,直接截取到字符串末尾
>结果为:biancheng.net

从指定字符(子字符串)开始截取

这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符

1)使用#号截取右边字符

使用#号可以截取指定字符(或子字符串)右边的所有字符,具体格式如下:

url="http://c.biancheng.net/index.html"
echo ${url#*:}>结果为://c.biancheng.net/index.htmlecho ${url#*p:}
echo ${url#*ttp:}

使用##可以直到最后一个指定字符(子字符串)再匹配结束

#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url#*/}
# 结果为:/c.biancheng.net/index.html
echo ${url##*/}
# 结果为:index.html

2)使用%截取左边字符

使用%号可以截取指定字符(或者子字符串)左边的所有字符

四、Shell脚本语言的运算

4.1 算数运算

shell支持算术运算,但只支持整数,不支持小数

4.2 Bash中的算术运算
-- + 加法运算
-- - 减法运算
-- * 乘法运算
-- / 除法运算
-- % 取模,即取余数
-- ** 乘方 #乘法符号在有些场景需要转义
4.2 实现算术运算
[root@localhost ~]# echo "scale=3;20/3"|bc
6.666
[root@localhost ~]# echo "scale=3;2/3"|bc
.666
[root@localhost ~]# i=20
[root@localhost ~]# j=20
[root@localhost ~]# declare -i sum=i*j
[root@localhost ~]# echo $sum
400

内建的随机数生成器变量:

$RANDOM  取值范围:0-32767

[root@localhost ~]# echo $[$[$RANDOM%50]+1]
40
[root@localhost ~]# echo $[$RANDOM%50]
44
[root@localhost ~]# echo $[$[$RANDOM%50]+1]  #生成1~50之间的随机数
[root@localhost ~]# echo $[RANDOM % 100 + 1]

生成随机颜色字符串

[root@localhost ~]# echo -e "\033[1;$[RANDOM%7+31]mStudy\033[0m"
Study
[root@localhost ~]# echo -e "\033[1;$[RANDOM%7+31]mStudy\033[0m"
Study
4.3 增强型赋值:
[root@localhost ~]# let var+=1
[root@localhost ~]# echo $var
1
[root@localhost ~]# let var++
[root@localhost ~]# echo $var
2
[root@localhost ~]# let var-=1
[root@localhost ~]# echo $var
1
[root@localhost ~]# let var--
[root@localhost ~]# echo $var
0
[root@localhost ~]#[root@localhost ~]# unset i j ;i=1;let j=i++;echo "i=$i,j=$j" 
i=2,j=1
[root@localhost ~]# unset i j ;i=1;let j=++i;echo "i=$i,j=$j"
i=2,j=2

4.2 逻辑运算

True用数字表示1,False用数字表示0

http://www.xdnf.cn/news/11936.html

相关文章:

  • 并行智算MaaS云平台:打造你的专属AI助手,开启智能生活新纪元
  • vue3表格使用Switch 开关
  • Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit
  • 使用C51和RTX-51微型交通灯控制器
  • 一种基于Service自动生成Controller的实现
  • 1.springmvc基础入门(一)
  • 栈-20.有效的括号-力扣(LeetCode)
  • 《复制粘贴的奇迹:原型模式》
  • C++课设:学生成绩管理系统
  • 【Axure视频教程】下载和安装Axure汉化包
  • 什么是单光谱
  • Python学习(6) ----- Python2和Python3的区别
  • 嵌入式学习笔记 - freeRTOS任务设计要点
  • 树莓派系列教程第九弹:Cpolar内网穿透搭建NAS
  • H5项目实现图片压缩上传——2025-06-04
  • 无法通过windows功能控制面板自动安装或卸载windows server角色或功能
  • 低成本奶泡棒解决方案WD8001功能说明
  • Hadoop企业级高可用与自愈机制源码深度剖析
  • docker的基本命令
  • AI界面遭劫持:Open WebUI被滥用于挖矿程序与隐蔽AI恶意软件
  • 如何快速找出某表的重复记录 - 数据库专家面试指南
  • 【力扣】3403. 从盒子中找出字典序最大的字符串 I
  • 判断:有那种使用了局部变量的递归过程在转换成非递归过程时才必须使用栈
  • AI批改作文的软件推荐:提升写作效率的智能工具
  • 厂商与经销商供应链数据协同:策略、实践与深度价值挖掘
  • 在WPS中如何启用宏VBA wps.vba.exe下载和安装
  • 【JVM】Java类加载机制
  • Python 多进程编程全面学习指南
  • Unity 大型手游碰撞性能优化指南
  • Axure高保真LayUI框架 V2.6.8元件库