Shell脚本和变量

一、shell脚本概述

1、shell脚本的概念

什么是shell?就是与内核沟通的界面、应用程序等等。比如你要放音乐,你的计算机通过你在shell输入的打开音乐的命令,shell再告诉操作系统的内核用户希望打开音乐,内核在通过CPU调度、内存管理、磁盘输入输出等工作。将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者。

  • 将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行权限
  • 可结合各种shell控制语句已完成更复杂的操作

2、shell脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行

3、Linux中有哪些shell

检查一下/etc/shells文件,里面就是Linux所包含的shell
最常用的就是bash、tcsh、sh、nologin这些shell都是依据Linux发展者的不同所创造出的不同版本。

  • bash:基准于GNU框架下发展出的shell
  • csh:语法有点类似于C语言的shell
  • tcsh:整合了csh,提供了更多的功能
  • sh:bash的前身,如今已被bash替代
  • nologin:奇怪的shell,这个shell可以让用户无法登录主机

:bash(/bin/bash)是目前大多数Linux版本采用的默认shell
在这里插入图片描述

二、shell的作用

shell是一个特殊的应用程序,它介于操作系统内核和用户之间,充当一个“命令解释器”的角色,负责接受用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核文件,并输出执行结果。
在这里插入图片描述

1、shell脚本的作用

  • 自动化运维
  • 批量化重复操作可以编写脚本结合计划任务自动周期运行
  • 减轻管理员工作量
  • 提高处理文本文件的速度
  • 避免配置出错

2、用户的登录shell

  • 登录后默认使用的shell程序,与一般为/bin/bash
  • 不同shell的内部指令、运行环境等会有所区别

三、编写shell脚本

1、编写脚本代码

  • 使用vim文本编辑器
  • 每行一条Linux命令,按执行顺序一次编写

2、赋予可执行权限

是脚本具有可执行属性

chmod +x 脚本文件

3、shell脚本的构成

  • 脚本申明(解释器):若第一行为#!/bin/bash 表示此行以下的代码语句是通过/bin.bash程序来解释执行,#!/bin/bash为默认解释器。还有其他类型的解释器,比如#!/usr/bin/python 、#!/usr/bin/expect
  • 注释信息:以#号开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行
  • 可执行语句:比如echo命令,用于输出“”双引号之间的字符串

编写一个脚本通常在第一行写入使用的shell环境,第二行注释脚本的信息,作者和写脚本的时间,方便日后查看。第三行往下是脚本的内容。
在这里插入图片描述

4、shell脚本的执行

方法一:绝对/相对路径指定脚本运行,需要执行用户 拥有执行权限,脚本会在子shell环境中运行

chmod +x /opt/first.sh
指定绝对路径:/opt/first.sh
指定相对路径:./first.sh

在这里插入图片描述

方法二:用bash/sh程序指定脚本文件运行,不需要执行权限,脚本会在子shell环境中运行

bash/sh 脚本路径:bash/sh first.sh

在这里插入图片描述

方法三:用source/.指定脚本文件运行,脚本会在当前shell环境中运行(会影响当前所在目录、变量的值等因素)

source 脚本路径:. first.sh或者source first.sh

在这里插入图片描述

四、重定向与管道操作

1、交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息
类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

2、重定向操作

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

2.1重定向输入

[root@localhost opt]# vim passwd.txt
[root@localhost opt]# useradd zhangsan
[root@localhost opt]# passwd --stdin zhangsan < passwd.txt 
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。

在这里插入图片描述

2.2重定向输出

[root@localhost opt]# cat passwd.txt 
123
[root@localhost opt]# echo 456 > passwd.txt 
[root@localhost opt]# cat passwd.txt 
456
[root@localhost opt]# 

在这里插入图片描述

[root@localhost opt]# cat passwd.txt 
456
[root@localhost opt]# echo 456 >> passwd.txt 
[root@localhost opt]# cat passwd.txt 
456
456

在这里插入图片描述

2.3标准错误输出

在这里插入图片描述

2.4混合输出

在这里插入图片描述

3、管道操作符号“|”

将管道符左侧的命令输出结果作为右侧命令的处理对象
比如给新建用户创建密码
在这里插入图片描述

五、shell的变量

1、变量的作用

用来存放系统和用户需要使用的特定参数(值)

  • 变量名:使用固定的名称,由系统预设或者用户自定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

2、变量的类型

  • 自定义变量:由用户自己定义、修改和使用
  • 特殊变量:环境变量、只读变量、位置变量、预定义变量

3、自定义变量

3.1变量的定义

shell中定义变量操作简单,不像其他高级语言(c++、python等)那么复杂,直接指定变量名称并赋给初始值(内容)即可

3.2定义一个新的的变量

  • 变量名以字母或者下划线开头,区分大小写,建议全大写
格式:
变量名=变量值

注意:等号两边没有空格

3.3查看变量的值

  • 用echo查看和引用变量的值

通过在变量名称前面添加前导符号“$”,可以引用一个变量的值,使用echo命令可以查看变量,可以在一条echo命令中同时查看多个变量值。

3.4取消定义的变量

unset 变量名

在这里插入图片描述

3.5赋值时使用引号

  • 双引号:允许通过$符号引用其他变量值
  • 单引号:禁止引用其他变量值,$视为普通字符
  • 反撇号:命令替换,提取命令执行后的输出结果

在这里插入图片描述在这里插入图片描述

3.6从键盘输入内容为变量赋值

read [-p "提示信息"] 变量名

在这里插入图片描述
在这里插入图片描述

3.7整数变量的运算

expr 变量1 运算符 变量2 [运算符 变量3]...

常用运算符

  • 加法运算:+
  • 减法运算:-
  • 乘法运算:*
  • 除法运算:/
  • 求模(取余)运算:%

在这里插入图片描述

3.8设置变量的作用范围

默认情况下,新定义的变量只在当前shell环境中有效,因此称为局部变量,当进入子程序或新的子shell环境时,局部变量将无法再使用

格式1:
export 变量名

格式2:
export 变量名=变量值

export是将变量变为全局变量,不管在什么shell环境下都能引用变量,但此命令只是临时变为全局变量,关机再开机就没了,要想一直是全局变量,按照如下操作

vim /etc/profile
添加
export 变量名
变量名=变量值

或

export 变量名=变量值

4、特殊的shell变量

4.1环境变量

  • 环境变量是由系统提前创建,用来设置用户的工作环境
  • 配置文件:/etc/profile、~/.bash_profile

4.2常见的环境变量

  • PWD、PATH
  • USER、SHELL、HOME

使用env 命令可以查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其各自的用途。例如,变量USER表示用户名称,HOME表示用户的宿主目录,LANG表示语言和字符集,PWD表示当前所在的工作目录,PATH 表示命令搜索路径等、RANDOM表示随机数,会返回0-32767的整数,USER表示当前账户的账户名称等,一般都用全大写定义,注意和自定义变量区分.

4.3PATH变量

PATH变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux系统将在 PATIH变量指定的目录范围查找对应的可执行文件,如果找不到则会提示"command not found"。
在这里插入图片描述

执行脚本又多了一种方法
可以将脚本文件复制到PATH变量定义的几个目录中

在这里插入图片描述
或者将脚本所在的目录加入到PATH变量中
在这里插入图片描述

4.4只读变量

  • 用于变量值不允许被修改的情况

在这里插入图片描述
重启之后就失效了

4.5位置变量

  • 表示为$n,n为1~9之间的数字

在这里插入图片描述
$0表示脚本本身
在这里插入图片描述
在这里插入图片描述

4.6预定义变量

  • $# :命令行中位置变量的个数
  • $* :所有位置变量的内容
  • $? :上一条命令执行后返回的状态,当返回值为0时,表示执行正常,非0值表示执行异常或出错
  • $0 :当前执行的进程/程序名
  • $@ :表示列出所有位置参数,但是是以单个的形式的列出
  • $$ :表示返回当前进程的进程号
  • $! :返回最后一个后台进程的进程号
[root@c7-1 ~]# vim fuhao.sh
#!/bin.bash

echo $1
echo "$0 表示当前执行的脚本或程序的名称"
echo "$# 表示命令行中位置的参数个数"
echo "$* 所有位置参数的内容,这些内容是当做一个整体"
echo "$@ 表示列出所有未知参数,但是是以单个的形式列出

[root@c7-1 ~]# bash fuhao.sh 1 2 3 4
1
fuhao.sh 表示当前执行的脚本或程序的名称
4 表示命令行中位置的参数个数
1 2 3 4 所有位置参数的内容,这些内容是当做一个整体
1 2 3 4 表示列出所有未知参数,但是是以单个的形式列出


#理解 $* 和 $@ 的区别
$*  :把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4"。
$@	:把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1" "$2" "$3" "$94"。

$*  :是将参数全部当做一个整体
$@	:是将参数每一个都当做单独的个体

set:查看系统所有的变量,包括环境变量和自定义变量(没有单独查看自定义变量的命令,可以set管道过滤)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值