欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-12 12:38:38
...

前言:

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

一、Shell脚本概述

  • 将要执行的命令吧顺序保存到一个文本文档
  • 给该文件可执行权限,便可运行
  • 可结合各种Shell控制语句以完成更复杂的操作

二、Shell脚本应用场景

  • 重复性操作
  • 批量事物处理
  • 自动化运维
  • 服务运行状态监控(zabbix)
  • 定时任务执行

三、Shell脚本的作用

3.1 Shell脚本的作用:命令解释器,翻译官

介于系统内核与用户之间,负责解释命令行
Shell脚本编程规范与变量(基础)

shell 控制Linux内核,内核态会加载系统硬件提供支持,然后输出信息 (结果、bug、err)

shell 也可以通过控制应用程序,再进行控制Linux内核

应用程序(例如kickstart 无人值守)

内核放在boot中,boot还存放的GRUB菜单

3.2 用户的登录Shell

登录后默认使用的Shell程序,一般为/bin/bash

不同的Shell的内部指令,运行环境等会有所区别

示例:

[aaa@qq.com ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

四、编写Shell脚本

4.1 编写脚本代码
  • 使用vi文本编辑器
  • 每行一条Linux命令,按执行顺序依次编写

示例:

[aaa@qq.com ~]# vi first.sh
#!/bin/bash
cd /boot/
pwd
ls -lh vm*

#!/bin/bash :代表固定格式,相当于声明

cd /boot :跳转到boot目录

pwd :显示目前所在工作环境的目录

ls -lh vm* :长格式友好显示(带有单位)以vm开头的所有文件。

4.2 执行脚本

注意!在执行脚本前我们要养成赋予脚本可执行权限的习惯

示例:

[aaa@qq.com ~]# chmod +x first.sh 
[aaa@qq.com ~]# ls -l 
-rwxr-xr-x. 1 root root   37 Nov 25 22:22 first.sh
.....省略部分内容

执行脚本的四种方式:

方法一:脚本文件路径(绝对路径与相对路径)

[aaa@qq.com ~]# ./first.sh 

此方法需要赋予执行权限

方法二:sh 脚本文件路径

[aaa@qq.com ~]# sh first.sh

此方法不要求脚本拥有执行权限,但如果脚本中执行了切换位置的命令,此方式不会进行切换。

方法三:source 脚本文件路径

[aaa@qq.com ~]# source first.sh 

此方法也不要求脚本拥有执行权限,但若脚本中执行了切换位置的命令,此方式同样会进行切换。

方法四:"." 的使用

[aaa@qq.com ~]# . first.sh 

此方式与方法三类似,但就生产环境而言,我们一般不会使用此方式。

4.3 更完善的脚本构成
  • 脚本声明
  • 注释信息
  • 可执行语句

示例:

#!/bin/bash
#这是我的第一个脚本.
cd /boot/
echo "当前的目录位于:"
pwd
echo "其中以vm开头的文件包括:"
ls -lh vm*
~                  

执行脚本:

[aaa@qq.com ~]# sh first.sh
当前的目录位于:
/boot
其中以vm开头的文件包括:
-rwxr-xr-x. 1 root root 5.7M Nov 25 19:07 vmlinuz-0-rescue-0c76c4a5ba044cb8a81c079681ade901
-rwxr-xr-x. 1 root root 5.7M Aug 23  2017 vmlinuz-3.10.0-693.el7.x86_64

五、重定向与管道操作

5.1 交互式硬件设备Shell脚本编程规范与变量(基础)
  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错误信息
5.2 重定向操作与管道操作
5.2.1 重定向操作

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

5.2.2 管道操作符号”|“
  • 将左侧的命令输出结果,作为右侧命令的处理对象

**格式:**cmd1 | cmd2 [… | cmdn]

示例:

[aaa@qq.com ~]# grep "login$" /etc/passwd | awk -F: '{print $1,$7}'
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
.......省略部分内容

awk -F: ‘{print $1,$7}’ 输出第一列与第七列

awk -F : 以":"分割

**{print $1,$7}:**位置变量统计

如果awk不加参数,只加段落内容,系统将默认按空格和tab(制表符)进行分割

六、Shell变量的作用、类型
6.1 变量的作用
  • 为灵活管理Linux系统提供特定的参数,包含两层意思:
    • 变量名:使用固定的名称,由系统预设或用户定义
    • 变量值:能够根据用户设置、系统环境的变化而变化
6.2 变量的类型
  • 自定义变量:由用户自己定义、修改和使用
  • 环境变量:由系统维护,用于设置工作环境(例如PATH)
  • 位置变量:通过命令行给脚本程序传递参数
  • 预定义变量:Bash中内置的一类变量,不能直接修改 (例如00、*、$#)
6.2.1 自定义变量1
  • 定义一个新的变量

变量名以字母或下划线开头,区分大小写,建议全部大写

变量名=变量值

“=” 为赋值符号,代表把赋值符号右边的内容赋予给左边的变量名

变量名的命名,以字母或者下划线开头,例如:

addr="192.168.100.100";

命名时,要么以字母开头,要么以”_“开头,例如:

_abc="hello"

不能以123abc=”world“;此格式进行命名

  • 查看变量的值

在输出时,需要在变量名前加上$符号

示例:

[aaa@qq.com ~]# addr=192.168.100.100
[aaa@qq.com ~]# echo $addr
192.168.100.100

PS:所有变量会存储在内存中,内存中的数据并不稳定(例如关机后会丢失)

此处需要注意:

如果重新赋予新的值,那么命名的值会更新(覆盖)

示例:

[aaa@qq.com ~]# addr=192.168.100.100
[aaa@qq.com ~]# echo $addr
192.168.100.100
[aaa@qq.com ~]# addr=10
[aaa@qq.com ~]# echo $addr
10

变量名对应的赋予值会独立存储

示例:

[aaa@qq.com ~]# addr=192.168.100.100
[aaa@qq.com ~]# echo $addr
192.168.100.100
[aaa@qq.com ~]# addr=10
[aaa@qq.com ~]# echo $addr
10
[aaa@qq.com ~]# num=$addr
[aaa@qq.com ~]# addr=20
[aaa@qq.com ~]# echo $num
10
[aaa@qq.com ~]# echo $addr
20

从以上信息我们可以得知,变量名在被赋予变量值后,会单独存储在一份空间,并不会随着之后的变量值更改而更改。

允许同时输出两个变量

示例:

[aaa@qq.com ~]# echo $addr $num
20 10
[aaa@qq.com ~]#

双引号输出的是变量
Shell脚本编程规范与变量(基础)

单引号控制输出的是普通符号与单词
Shell脚本编程规范与变量(基础)

6.2.2 自定义变量2

赋值时使用引导

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

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

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

反撇号”`“ 命令替换,提取命令执行后的输出结果

示例:

[aaa@qq.com opt]# ps aux | wc -l
188
[aaa@qq.com opt]# num=`ps aux | wc -l`
[aaa@qq.com opt]# echo $num
189
[aaa@qq.com opt]# abc=$(ps aux | wc -l)
[aaa@qq.com opt]# echo $abc
189

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

示例一:

#!/bin/bash
echo "请输入你的成绩"
read score
echo "你的成绩为$score"

示例二:

你的成绩为12
#!/bin/bash
read -p "请输入你的成绩" score
echo "你的成绩为$score"
---->wq
[aaa@qq.com opt]# ./demo.sh
请输入你的成绩12
你的成绩为12
6.2.3 自定义变量3
  • 设置变量的作用范围

命令格式1:export 变量名

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

两种格式可以混用

示例:
Shell脚本编程规范与变量(基础)

6.2.4 自定义变量 4
  • 整数变量的运算

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

  • 常用运算符
    Shell脚本编程规范与变量(基础)

例如:

[aaa@qq.com opt]# expr 3 + 2
5
[aaa@qq.com opt]# expr 3 - 2
1
[aaa@qq.com opt]# expr 3 \* 2
6
[aaa@qq.com opt]# expr 3 % 2
1
[aaa@qq.com opt]# sum=`expr 3 + 3`
[aaa@qq.com opt]# echo $sum
6
6.3 特殊Shell变量
  • 环境变量

    由系统提前创建,用来设置用户的工作环境

    配置文件: /etc/profile、~/.bash_profile

  • 常见的环境变量

    PWD、PATH

    USER、SHELL、HOME

示例:

[aaa@qq.com opt]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
6.3.1 特殊的Shell变量 1
  • 位置变量

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

例如:

[aaa@qq.com opt]# ./demo.sh one two three four five six

以上示例中 ./demo.sh 为$0 one为$1 一次类推

示例:

[aaa@qq.com opt]# vi demo01.sh
#!/bin/bash
sum=0
sum=`expr $1 + $2`
echo "总和为$sum"
echo "执行的脚本数为$0"
echo "参数格式为$#"
------->wq
[aaa@qq.com opt]# ./demo01.sh 10 20
总和为30
执行的脚本数为./demo01.sh
参数格式为2
6.3.2 特殊的Shell变量 2
  • 预定义变量

    $#:命令行中位置变量的个数

    $*:所有位置变量的内容

    $?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错

    $0:当前执行的进程/程序名

示例:

[aaa@qq.com opt]# vi demo02.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行$0脚本"
echo "共完成$#个对象的备份"
echo "具体内容包括:$*"
--------》wq
[aaa@qq.com opt]# chmod +x demo02.sh 
[aaa@qq.com opt]# ./demo02.sh  /etc/passwd /etc/shadow
已执行./demo02.sh脚本
共完成2个对象的备份
具体内容包括:/etc/passwd /etc/shadow
  • 预定义变量

    $#:命令行中位置变量的个数

    $*:所有位置变量的内容

    $?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错

    $0:当前执行的进程/程序名

示例:

[aaa@qq.com opt]# vi demo02.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行$0脚本"
echo "共完成$#个对象的备份"
echo "具体内容包括:$*"
--------》wq
[aaa@qq.com opt]# chmod +x demo02.sh 
[aaa@qq.com opt]# ./demo02.sh  /etc/passwd /etc/shadow
已执行./demo02.sh脚本
共完成2个对象的备份
具体内容包括:/etc/passwd /etc/shadow

总结:

Shell脚本变成规范与变量是我们学习的基础,我认为在写Shell脚本的过程中,我们尤为需要注重:
1、Shell脚本中需空格的部分
2、撇、双引号、单引号、小括号、中括号和大括号的用法
对于三种括号的用法,小结以下技巧:

字符串比较用双中括号 [[ ]] ;算数比较用单中括号 [ ] ----左右需留空格
算数运算用双小括号(( ));Shell命令及输出用小括号( )-------左右不需要留空格
快速替换用大括号 { }------左右需留空格
反单引号起着命令替换的作用(ESC下方的键)
3、打“引号”的时候,输入法最好统一(中、英文输入法)

相关标签: Shell脚本攻略