【shell】初识shell脚本语言

目录

前言

一、shell脚本基础

1、shell的作用

2、shell脚本的本质

3、shell脚本的格式

4、执行脚本的方式:

4.1使用指定的shell解释器:(不需要脚本有执行权限)

4.2路径的方式:

4.3使用source和"."执行脚本:这种一般不常用

5、脚本错误调试

二、重定向与管道符

1、重定向

2、使用重定向输入输出

2.1重定向输入

2.2重定向输出覆盖和追加

2.3重定向标准错误输出覆盖和追加

2.4混合输出

拓展思考:

三、变量学习

1、变量基础以及常见的shell变量的类型

2、特殊符号学习

2.1花括号:表示定义变量的范围

2.2双引号:表示弱引用,可以调用变量的值

2.3单引号:表示强引用,表示调用单引号内容本身

[2.4反撇号(反引号):表示调用命令的结果,也等于()](#2.4反撇号(反引号):表示调用命令的结果,也等于())

3、整数运算

[3.1let 变量值1=变量2运算符变量3(没有空格)](#3.1let 变量值1=变量2运算符变量3(没有空格))

[3.2变量1=`expr 变量2 运算符 变量3`(注意空格)](#3.2变量1=expr 变量2 运算符 变量3(注意空格))

[3.3变量1=(expr 变量2 运算符 变量3)(注意空格)](#3.3变量1=(expr 变量2 运算符 变量3)(注意空格))

[3.4变量1=((变量2运算符变量3))](#3.4变量1=((变量2运算符变量3)))

[3.5变量1=\[变量2运算符变量3\]](#3.5变量1=[变量2运算符变量3])

[3.6变量1=`echo 变量2 运算符 变量3|bc`](#3.6变量1=echo 变量2 运算符 变量3|bc)

3.7产生随机数,灵活应用取余%和随机数RANDOM

4、环境变量

5、预定义变量

6、位置变量

7、只读变量

前言

编程语言的风格

面向过程的语言:开发的时候,需要一步一步执行,比较方便去排查,如shell、c等

面向对象的语言:开发的时候,将任务当成一个整体使用,如Python,go,java等

一、shell脚本基础

1、shell的作用

shell是一种特殊的应用程序,是"命令解释器",是内核与用户之间的翻译官,负责接收用户的指令,将其进行解释,将需要执行的操作传递给内核去执行,并输出执行结果。

##查看当前系统支持的shell类型
[root@localhost opt]#cat /etc/shells 
/bin/sh        ##已经被bash替代
/bin/bash      ##基于gun的框架下发展的shell
/sbin/nologin  ##让用户无法登录
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh      ##整合了csh提供了更多的功能
/bin/csh       ##类似c语言的shell

2、shell脚本的本质

shell脚本的本质:命令的集合,命令的本质是程序,那么shell脚本的本质是程序;人类写了一个命令的集合,用bash这个软件,将命令交给硬件去执行;

shell脚本的特点:虽然linux一切皆文件,但是习惯还是将脚本以".sh"结尾,vim编辑器会给脚本中的命令高亮,便于去做语法排错;

3、shell脚本的格式

3.1脚本解释器申明:如#!/bin/bash

3.2脚本注释信息:以#开头的语句为注释信息,一般是解释命令的作用

3.3可执行的语句:脚本真正的执行部分

4、执行脚本的方式:

4.1使用指定的shell解释器:(不需要脚本有执行权限)
[root@localhost opt]#bash test.sh ##直接用bash解释器去执行
4.2路径的方式:
[root@localhost opt]#ll test.sh 
-rw-r--r-- 1 root root 129 11月 20 15:12 test.sh
[root@localhost opt]#chmod 777 test.sh  ###加上执行权限
[root@localhost opt]#ll test.sh 
-rwxrwxrwx 1 root root 129 11月 20 15:12 test.sh
[root@localhost opt]#/opt/test.sh  ##绝对路径执行
[root@localhost opt]#./test.sh     ##相对路径执行

[root@localhost opt]#ln -s /opt/test.sh /usr/sbin/test.sh  ##做软连接到$PATH中
[root@localhost opt]#test.sh   ##直接作为可不全的外部命令执行
4.3使用source和"."执行脚本:这种一般不常用

会重新加载一个子bash环境去执行,会修改当前bash环境,建议小白不使用即可;

5、脚本错误调试

5.1命令错误

5.2语法错误

5.3逻辑错误

为了防止错误的脚本带来不可估量的后果:

第一,在执行脚本之前使用"bash -n 脚本"进行语法检查,或者在测试机器上先进行调试检测

第二,在脚本中建议加上set -e(遇到错误的命令即终止,不再往下执行)

第三,在脚本中建议加上set -u(遇到变量赋值不正确,即终止)

二、重定向与管道符

1、重定向

重定向:改变电脑的数据输出方向,默认是输出在屏幕上

|--------|-------------|--------|------|
| 类型 | 设备文件 | 文件描述编号 | 默认设别 |
| 标准输入 | /dev/stdin | 0 | 键盘 |
| 标准输出 | /dev/stdout | 1 | 显示器 |
| 标准错误输出 | /dev/stderr | 2 | 显示器 |

举例说明:

**标准输入:**echo "123" |passwd --stdin xueyin

**标准输出:**ls /opt(命令和目录都是正确存在的,会执行显示结果)

**标准错误输出:**ls xxxxxx(没有这个xxx的文件,会进行报错提示)

2、使用重定向输入输出

|--------|------------|--------------------------------------|
| 类型 | 操作符 | 用途 |
| 重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
| 重定向输出 | 1>或> | 将输出结果保存到指定的文件(覆盖原有内容) |
| 重定向输出 | 1>>或>> | 将输出结果追加到指定的文件尾部 |
| 标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
| 标准错误输出 | 2>> | 标准错误输出结果追加到指定的文件尾部 |
| 混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中(无论对错都可以重定向覆盖) |
| 混合输出 | &>> | 将标准输出、标准错误的内容保存到同一个文件中(无论对错都可以重定向追加) |

2.1重定向输入
2.2重定向输出覆盖和追加

第一种,/dev/pts改变输出的终端显示器

第二种:>覆盖

第三种:>>追加

注意,这里没有写1或者2,那么默认是1

2.3重定向标准错误输出覆盖和追加

注意:这里的2是设备符号,只能是2,系统规定的!!!

2.4混合输出

在脚本中常用的是 &>/dev/null 不显示过程,将其导入到黑洞里

拓展思考:

#下面哪一项不能将正确和错误一起显示出来

[root@centos7 ~]#ls /data /xxx 1> /data/all.log 2>&1

[root@centos7 ~]#ls /data /xxx 2> /data/all.log 1>&2

[root@centos7 ~]#ls /data /xxx &> /data/all.log

[root@centos7 ~]#ls /data /xxx >& /data/all.log

[root@centos7 ~]#ls /data /xxx 2>&1 1> /data/all.log(不可以)

分析:

[root@centos7 ~]#ls /data /xxx 1> /data/all.log 2>&1
###先将正确的输出导入到all.log中,然后错误的输出导入结尾的1,这个1表示设备,然后再循环回去,将1输出到all.log,最终all.log有了正确+错误的内容

[root@centos7 ~]#ls /data /xxx 2> /data/all.log 1>&2 
###先将错误的输出导入到all.log中,然后正确的输出导入结尾的2,这个2表示设备,然后再循环回去,将2输出到all.log,最终all.log有了正确+错误的内容

[root@centos7 ~]#ls /data /xxx &> /data/all.log  
[root@centos7 ~]#ls /data /xxx >& /data/all.log  
###这两种就是常用的混合输入,&写在重定向符号前面后面都可以

[root@centos7 ~]#ls /data /xxx 2>&1 1> /data/all.log
这里只能识别到第二个1,表示只保存正确的输出结果到all.log中

3、管道符

管道符的作用:将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

常与xarges结合使用

三、变量学习

1、变量基础以及常见的shell变量的类型

变量有5种类型:①自定义变量(自己定义的)、②环境变量(这是系统维护的,如PATH等)、③只读变量、④位置变量、⑤预定义变量

后面文章逐一讲解

关于自定义变量的命名要求:需要区分大小写、不能使用程序中的保留变量名称,只能使用数字、字母、下划线,且不能以数字开头,注意不支持短横线"-"

2、特殊符号学习

2.1花括号:表示定义变量的范围

2.2双引号:表示弱引用,可以调用变量的值

2.3单引号:表示强引用,表示调用单引号内容本身

2.4反撇号(反引号):表示调用命令的结果,也等于$()

3、整数运算

整数运算的方法有

3.1let 变量值1=变量2运算符变量3(没有空格)

3.2变量1=`expr 变量2 运算符 变量3`(注意空格)

3.3变量1=$(expr 变量2 运算符 变量3)(注意空格)

3.4变量1=$((变量2运算符变量3))

3.5变量1=$[变量2运算符变量3]

3.6变量1=`echo 变量2 运算符 变量3|bc`

3.7产生随机数,灵活应用取余%和随机数RANDOM

想要随机产生1-32:$[RANDOM%32+1]

4、环境变量

拓展:

每开一个窗口就会新加载一个bash,在当前bash下输入bash,就会生成一个子bash,关于环境变量,子bash不会继承父bash的变量值,除非父bash加上export进行变量申明

5、预定义变量

5.1$?:返回上一次的执行结果,0是正确,其他是错误

5.2$$:输出当前bash的pid号

5.3$0:表示脚本的名称

5.4$#:表示位置参数的总个数

5.5$@:返回所有的参数,将参数逐个返回

5.6$*:返回所有的参数,把参数当成一个整体一起返回

5.7$!:返回上一次执行的进程pid号

6、位置变量

1-n表示参数的位置

7、只读变量

相关推荐
程序员南飞36 分钟前
ps aux | grep smart_webrtc这条指令代表什么意思
java·linux·ubuntu·webrtc
StrokeAce36 分钟前
linux桌面软件(wps)内嵌到主窗口后的关闭问题
linux·c++·qt·wps·窗口内嵌
热爱嵌入式的小许5 小时前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
韩楚风8 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学8 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO8 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu79 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我9 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、9 小时前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程9 小时前
Linux中环境变量
linux