Shell脚本基础 编程规范与变量

12 篇文章 1 订阅

目录

一、Shell脚本的概述

1.1 Shell脚本的概念

1.2 Shell脚本的应用场景

 1.3 Shell脚本的作用

1.4 linux中常见的Shell

二、Shell脚本的编写

 2.1 Shell脚本的构成

2.2 Shell脚本执行逻辑及执行方式

 2.3 Shell脚本错误检查

三、重定向与管道符

3.1 管道操作符号“|”

 3.2 重定向

3.2.1 交互式硬件设备

3.2.2 重定向操作

 四、Shell变量的作用和类型

4.1 变量的作用

4.2 变量的分类

4.3 变量的命名要求

4.4 自定义变量

4.5 变量的作用范围

4.6 整数变量的算术计算

4.7  环境变量

4.8 只读变量

 4.9 位置变量

 4.10 预定义变量

 4.11 浮点数的运算


一、Shell脚本的概述

1.1 Shell脚本的概念

shell 脚本(shell Script ):就是将要执行的命令按顺序保存到一个文本文件,并给该文件可执行权限,方便一次性执行的一个程序文件。
脚本的作用:方便管理员进行设置或者管理,可结合各种shell控制语句以完成更复杂的操作。

1.2 Shell脚本的应用场景

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

 1.3 Shell脚本的作用

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。

常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符 等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

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

查看本机的shell信息

[root@test1 ~]# cat /etc/shells              //查看当前的系统支持的shell
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@test1 ~]# useradd -s

1.4 linux中常见的Shell

检查一下/etc/shells这个文件, 里而就是Linux所包含的Shell.

最常用的就是bash、tcsh、 csh、 sh、nologin这些shell.这些shell都是依据Linux发展者的不同所创造出的不同版本。

bash:基于gun的框架下发展的shell

csh:类似c语言的shell

tcsh:整合了csh提供了更多功能

sh:已经被bash替换

nologin:让用户无法登录

注:bash (/bin/bash) 是目前大多数Linux版本采用的默认shell

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

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

二、Shell脚本的编写

 2.1 Shell脚本的构成

1、脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行一下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认解释器。#!/bin/python #!/bin/expect

2、注释信息:以#开头的语句表示为注释信息

3、可执行语句:比如echo命令用于输出“ ”之间的字符串

vim first.sh

#!/bin/bash
# This is my first Shell-Script.
cd /boot
echo "当前的目录位于:"
pwd
echo "其中以vml开头的文件括:"
ls -lh vml*

2.2 Shell脚本执行逻辑及执行方式

脚本执行逻辑

  1. 顺序执行:程序按从上到下顺序执行

  2. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

  3. 循环执行:程序执行过程中需要重复执行多次某段语句

执行方式

方法一:指定路径去执行文件(需要有执行权限)

[root@localhost ~]# chmod +x /root/host.sh    加权限

指定相对路径./host.sh

指定绝对路径/root/host.sh

 

 方法二:指定Shell来解释脚本,不要求文件必须有 x 权限

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

 

 

 

 2.3 Shell脚本错误检查

  1. 命令错误

    命令出错不会影响接下来的命令继续

  2. 语法错误

    会影响接下来的命令继续

  3. 逻辑错误

    只能自己去筛查

查代码的正确

bash -n 脚本名称 (不在当前目录下加绝对路径)     检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径)     逻辑错误

三、重定向与管道符

3.1 管道操作符号“|”

将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

示例:
ps aux | wc -l       #统计系统进程的总量
echo "123456" | passwd --stdin zhangsan   #将用户zhangsan的password改为123456

 3.2 重定向

3.2.1 交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据

  • 标准输出:通过该设备向用户输出数据

  • 标准错误:通过该设备报告执行出错信息

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

3.2.2 重定向操作

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出
  
1>将输出结果保存到指定的文件(覆盖原有内容)
  >>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
2>>将错误信息保存到指定的文件
混合输出&>将标准输出、标准错误的内容保存到同一个文件中
示例:
echo "123456" > pass.txt     #将123456定义到pass.txt文件中(此时文件中只剩下123456)
passwd --stdin zhangsan < pass.txt    #读取pass.txt中的字符将其定义成zhangsan用户的password

ls -lh > log.txt 2>&1  等同于 ls -lh &> log.txt
本来ls -lh 直接输出的屏幕(等同于1指定屏幕)
执行>log后,是将标准输出结果保存到log.txt (1指向log.txt)
执行2>&1后,是将标准错误输出定义到标准输出信息中(2指向1,而1指向log.txt,因此2也指向了log.txt)

 

 

 四、Shell变量的作用和类型

变量来源与数学,是计算机语言中能存储计算结果或能表示值得抽象概念。

4.1 变量的作用

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

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

4.2 变量的分类

自定义变量:由用户的自己定义的、修改和使用

环境变量:由系统维护,用于设置工作环境

位置变量:通过命令行给脚本文件传递参数

预定义变量:Bash中内置的一类变量,不能直接修改

注:环境变量、只读变量、位置变量、预定义变量都是特殊变量

4.3 变量的命名要求

  • 定义一个新的变量
  • 变量名以字母或下划线开头,区分大小写,建议全大写
  • 变量名=变量值
  • 给变量赋值的第二种方法
  • declare 命令用于声明变量

区分大小写

  1. 不能使用程序中的保留字和内置变量,如:if,for,hostname
  2. 只能使用字母及下划线,且不能以数字开头,注意:不支持短横线"-",和主机名相反
  3. 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
  • 大驼峰StudentFirstName
  • 小驼峰studentFirstName
  • 下划线: student_name

4.4 自定义变量

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

    格式:变量名=变量值

  • 查看变量的值

    格式:echo $变量名

示例:
Product=Python   #将右边的变量值赋予左边的变量名,这里可以理解成Product=Python,但Python≠Product
version=4.0      #version=4.0,但4.0≠version

echo $product
echo $product $version

 

 赋值时使用引号

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

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

read命令获取输入内容(只能识别出一行命令   不换行输出)

1.赋值时使用双引号(“”)可以直接调用变量

⒉赋值时使用单引号(")只会被认为是字符只会被认为是字符不会调用变量

3.赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结果$()用法相同

4.{}可以分隔变量值

read -p "提示信息" 变量名
echo $变量名

 

方法二:在脚本中编写,在命令行实现read获取

 

4.5 变量的作用范围

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

 输入 bash 命令进入子Shell环境

 

输入 exit 命令退出子Shell环境,并在子环境下测试设置的全局变量是否生效 

变量名设置格式:变量名=变量值
全局变量格式:export 变量名=变量值

4.6 整数变量的算术计算


运算符:+ 加法、- 减法、* 乘法、/除法、% 取余

常见表达式:

expr 变量1 运算符 变量2 
var=$(expr 变量1 运算符 变量2)
var=$((变量1 运算符 变量2))
var=$[变量1 运算符 变量2]
let var=变量1 运算符 变量2
 
i++相当于i=$[$i + 1],i++是先赋值,再运算
i--相当于i=$[$i - 1],++i是先运算再赋值
i+=1相当于i=$[$i + 1]

示例1:使用管道符

 示例2:expr不可计算小数,并且变量和运算符之间需要空格分隔

示例3:计算乘法时,需要使用“\”符

 示例4:取余只需要除后的余数

4.7  环境变量

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

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

配置文件:/etc/profile(全局生效)、~/.bash_profile(当前用户环境)

4.8 只读变量

readonly命令用于定义只读shell变量和shell函数。readonly命令的选项-p可以输出显示系统中所有定义的只读变量。

 4.9 位置变量

  • 当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。

  • $n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}

 

 4.10 预定义变量

$* 和 $@:都会表示命令或脚本要处理的参数。

$* :把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4 "

$@:把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表“$1” “$2” “$3” “$4”

$0:表示当前执行的脚本或命令的名称。

$#:表示命令或脚本要处理的参数的个数。

$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
示例:
vim mybak.sh
#!/bin/bash
time=backup-`date +%F`.tgz
tar zcf $time $* &> /dev/null	#/dev/null表示的是一个黑洞文件,通常用于丢弃不需要的数据输出
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo "具体内容包括: $*"

chmod +x mybak.sh
./mybak.sh /etc/passwd /etc/shadow

 

 

 

 

 4.11 浮点数的运算

  • bc命令,是一种精密运算工具,支持浮点数运算,当然整数运算也是支持的。

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

#! /bin/bash

#加

f=$ (echo "4.3+2.5"Ibc)

echo "4.3+2.5=$f"

#减

f=$(echo "4.3-2.5" Ibc)

echo

"4.3-2.5=$f"

#乘

f=$(echo "4.30*2.50"Ibc)

echo "4.3*2.5=$f"

#除

f=$ (echo "scale=2;4.3/2.5"Ibc)

echo "4.3/2.5=$f"

#混合运算

f=$ (echo "2.2/(2.2-1.1)*2+1.1"Ibc)

echo "2.2/ (2.2-1.1)*2+1.1=$f"

#加

f=$ (awk 'BEGIN{print 4.5+3.4 }')

echo "4.5+3.4=$f"

#减

f=$ (awk 'BEGIN{print 4.5-3.4 }')

echo'

"4.5-3.4=$f"

#乘

f=$ (awk 'BEGIN{print 4.5*3.4 }')

echo "4.5*3.4=$f"

#除

f=$ (awk 'BEGIN{print 4.5/3.4 }')

echo "4.5/3.4=$f"

#混合

f=$ (awk 'BEGIN{print (4.5-3.4)*2+3 }')

echo " (4.5-3.4)*2+3=$f"

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值