shell编程之规范与变量

shell

shell定义

运行于linux系统当中的一种特殊程序。

充当翻译官的角色,用于进行使用者输入的指令翻译成内核可以识别的二进制(进行命令行的解释),进而有内核去调用系统硬件设备。
在这里插入图片描述

Linux中有哪些Shell ?

登录后默认使用的Shell程序,一般默认为是:/bin/bash。
且是目前大多数Linux 版本采用的默认Shell。
在不同Shell的内部指令、运行环境等会有所区别

在这里插入图片描述

shell程序说明
bash基准于GNU的框架下发展出的Shell
csh语法有点类似于c语言的Shell
tcsh整合了csh,提供更多的功能
sh已经被bash所替换
nologin奇怪的shell,这个shel1可以让用户无法登录主机

为什么系统上合法的Shell要写入/etc/ shells这个文件呢?
这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件。

用户什么时候可以取得shq1l来工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给我一个shell让我来用, 而这个登录取得的Shell就记录在/etc/passwd这个文件内

shell 的应用场景

shell脚本是将要执行的命令按顺序保存到一个文本文件,并给该文件可执行权限,方便一次性执行的一个执行文件。
可结合各种Shel控制语句以完成更复杂的操作

常用于:
1.重复性操作
2.交互性任务
3.批量事务处理
4.服务运行状态监控
5.定时任务执行

shell脚本的构成

1.脚本申明(解释器) :若第一行为“#! /bin/bash", 表示此行以下的代码语句是通过/bin/bash程序来解释执行,

#!/bin/bash为默认解释器。还有其它类型的解释器,比如#! /usr/bin/python、#!/usr/bin/ expect。

2.注释信息:以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。

3.可执行语句:比如echo命令,用于输出" "之间的字符串

vim first. sh
#! /bin/bash
#This is my first Shell -Script.
cd /opt
echo “当前的目录位于:”
pwd
echo “其中以vml开头的文件包括:”
ls -lh *.sh
在这里插入图片描述

shell脚本的执行

方法一
指定路径的命令,要求文件必须有x权限。
chmod +x / root/ first. sh
在这里插入图片描述

指定绝对路径: /root/ first. sh
在这里插入图片描述

指定相对路径: . / first. sh
在这里插入图片描述

方法二
指定Shel1来解释脚本,不要求文件必须有x权限。
在这里插入图片描述

sh脚本路径: sh first.sh
在这里插入图片描述

source 脚本路径: first.sh或者 source first.sh
在这里插入图片描述

管道操作 |

将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同–行命令中可以使用多个管道。
ps aux| wc -l
在这里插入图片描述

echo “abc123” | passwd – stdin sk
在这里插入图片描述

重定向

1.标准输入:从该设备接收用户输入的数据
2.标准输出:通过该设备向用户输出的数据
3.标准错误:通过该设备报告执行的出错信息

交互式硬件设备

类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/ dev/stdout1显示器
标准错误输出/dev/stderr2显示器

重定向操作

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

例:
echo “123456” > pass.txt
在这里插入图片描述

passwd --stdin sk < pass.txt
在这里插入图片描述

#从pass.txt 文件中取密码,需要注意SELinux 会影响此命令执行,若执行失败可尝试关闭SELinux

ls -1h > log.txt 2>&1等同于
ls -1h &> log. txt
本来1–>屏幕( 1指向屏幕)
执行>log后,1–>1og. txt (1指 向log. txt)
执行2>&1后,2–>1 (2指 向1,而1指向log. txt,因此2也指向了log. txt)

shell变量

变量的做用

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

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

变量的分类

自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境
位置变量:通过命令行给脚本程序传递参数
预定义变量: Bash中内置的一类变量,不能直接修改

自定义变量

定义新的变量

变量名=变量值
变量命名规则:以字母或下划线开头,区分大小写

echo $变量名  
查看变量的值

等号(=)用来给变量赋值
等号(=)运算符左边是一个变量名,等号(=) 运算符右边是存储在变量中的值

product=benet
version=6.0
name=“sk”
在这里插入图片描述
赋值时使用引号
双引号:允许通过 符 号 弓 ∣ 用 其 他 变 量 值 单 引 号 : 禁 止 引 用 其 他 变 量 值 , 符号弓|用其他变量值 单引号:禁止引用其他变量值, :视为普通字符
反撇号:命令替换,提取命令执行后的输出结果,、…、和$(…作用相同

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

方法一
read [-p "提示信息"] 变量名
echo $变量名

在这里插入图片描述

方法二:
echo -n "提示信息"
read 变量名
echo $变量名

在这里插入图片描述

设置变量的作用范围

默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shel1环境时,默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shel1环境时
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用

格式1

export 变量名 ...

格式2

export 变量名=变量值 ...

两种格式可以混合使用

使用pstree命令可以查看Shell环境;
在这里插入图片描述
输入bash命令进入子Shell环境;

在这里插入图片描述

按Ctrl+D组合键或输入exit命令退出子Shell环境。

特殊的shell变量

环境变量

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

export product version
导出为全局变量

bash

echo "Sproduct $version"
子程序引用全局变量

使用env命令可以查看到当前工作环境下的环境变量

常见的环境变量
变量USER表示用户名称,
HOME表示用户的宿主目录,
LANG表示语言和字符集,
PWD表示当前所在的工作目录,
变量PATH表示可执行程序的默认搜索路径

echo $ PATH
查看当前搜索路径

PATH="$PATH:/root "/root目录添加到搜索路径

export PATH="$PATH:/root"
输出为全局环境变量
first.sh

环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。每个用户还有自己的独立配置文件(~/.bashprofile)。可以用来长期变更或设置某个环境变量。

vim /root/.bash_profile
export HISTSIZE=200
修改root用户的历史命令记录条数

在这里插入图片描述

echo $HISTSIZE
source /root/.bash_profile
#读取并执行文件中的设置
echo $HISTSIZE

在这里插入图片描述

readonly命令设置只读变量

product=benet

readonly product
设置为只读变量

echo Sproduct
product=accp
只读变量不可以被重新赋值

unset product
只读变量不可以被删除,unset命令用于删除变量

整数变量的运算

格式: expr 变量1 运算符 变量2 [运算符 变量3]

常用的运算符

符号做用
+加法
-减法
\ *乘法
/除法
%取余

expr 12 * 5

常用的运算表达式:

 i=$ (expr 10 \* 5)

 i=$((10 * 5))

 i=$[10 * 5]

 let i=10*5

 i++ 相当于 i=$[$i+1]

 i-- 相当于 i=$ [$i- 1]

 i+=2 相当于 i=$[$i+2]

浮点运算

bash不支持浮点运算,如果需要进行浮点运算,需要借助bc, awk处理。

加
echo "5.7+9.6" |bc

减
echo "5.7-9.6" |bc

乘
echo "5.70*9.60" |bc

除
echo "scale=2;5.7/9.6" |bc

混合运算
echo "2.2/ (2.2-1.1) *2+1.1"|bc

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值