0
点赞
收藏
分享

微信扫一扫

Shell 编程规范与变量

星巢文化 2022-04-13 阅读 87

文章目录

1 Shell

shell 是 Linux 系统中运行的一种特殊程序
shell:介于系统内核与用户之间,负责解释命令行

1.1 Shell 作用

(1)命令解释器(翻译官):介于用户与系统内核之间,负责解释命令行
在这里插入图片描述
(2)用户登录的 shell

  • 用户登陆Linux系统时,自动加载一个Shell程序
  • bash是Linux系统中默认使用的Shell程序
  • bash文件位于/bin/bash

shell是用户和内核之间的翻译官,用户输入指令给shell;shell接收用户输入的指令后进行翻译,翻译后给内核;然后内核调用硬件设备硬件才能工作,否则无法交互。

2 Shell 脚本概述

  • shell 是弱类型语言,定义变量时不需要事先定义它的数据类型;而java、c++、go等是强类型语言,定义变量时需要事先定义它的数据类型(整数型、浮点型、字符型、字符型)
  • shell 脚本为一系列命令的集合,将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行权限
  • 可结合各种 Shell 控制语句以完成更复杂的操作

脚本执行逻辑

  • 顺序执行:程序按从上到下顺序执行(文件)
  • 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  • 语环执行:程序执行过程中需要重复动行多次某段语句
[root@localhost ~]# cat /etc/shells    //查看系统可支持的 shell 环境
bash默认的shell程序
cah 语法类似于c语言的
sh bash的前身
nologin 用户无法登陆主机

在这里插入图片描述

2.1 Shell 脚本应用场景

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

完成自动化运维
批量化的重复操作
结合crontal完成周期性任务

3 编写 Shell 脚本

3.1 脚本的构成

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

3.2 编写脚本代码

  • 使用 vim 文本编辑器,每一行的 Linux 命令按脚本执行顺序依次编写
  • 赋予可执行权限:使脚本具有可执行属性
[root@localhost ~]# vim first.sh
#!/bin/bash
表示本脚本由/bin/路径的bash程序来解释

在这里插入图片描述

3.2.1 注释有两种写法

第一种:使用#来注释

#人生如戏,全靠演技
#在哪里跌倒,就在哪里躺下

第二种:使用<<来注释,<<后面的单词不指定,但前后要一致

<<COMMENT
人生如戏,全靠演技
在哪里跌倒,就在哪里躺下
COMMENT

3.3 执行脚本方式

方法一:脚本无文件路径(绝对路径与相对路径,需要x权限)
赋予脚本可执行权限后,执行脚本的方式

[root@localhost ~]# vim two.sh
[root@localhost ~]# ./two.sh
[root@localhost ~]# chmod +x two.sh
[root@localhost ~]# pwd
[root@localhost ~]# ls -lh

在这里插入图片描述
相对路径

[root@localhost ~]# ls   //可以看到脚本文件在/root目录下
[root@localhost ~]# ./first.sh

在这里插入图片描述
绝对路径

[root@localhost ~]# ls
[root@localhost ~]# cd /
[root@localhost /]# /root/first.sh

在这里插入图片描述
方法二:shell 脚本文件路径(不要 x 权限)

[root@localhost ~]# vim first.sh
[root@localhost ~]# ls
[root@localhost ~]# chmod 000 first.sh
[root@localhost ~]# sh first.sh

以sh方式一样是需要x权限的
执行方式也是区分相对路径和绝对路径

在这里插入图片描述
方法三source. 脚本文件路径(不需要x权限)
对比方法一
在这里插入图片描述
主内容编写案列:创建本地yum源

[root@localhost ~]# vim local.sh
[root@localhost ~]# chmod +x local.sh
[root@localhost ~]# ./local.sh
[root@localhost ~]# ls /etc/yum.repos.d/

[root@localhost ~]# bash -x local.sh   //逐行调试,检测脚本错误,定位哪行错误
[root@localhost ~]# bash -n local.sh   //检测语法错误,只显示错误的那行

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

3.4 脚本错误调试

脚本错误常见的有三种区别

  • 语法错误,会导致后续的命令不继续执行,可以用 bash-n 检查错误,提示的出错行数不一定是准确的
  • 命令错误,默认后续的命令还会继续执行,用 bash-n 无法检查出来,可以使用 bash-x 进行观察
  • 逻辑错误:只能自己去筛查
查代码的正确
bash -n  脚本名称(不在当前目录下加绝对路径)  //检查语法错误
bash -x  脚本名称(不在当前目录下加绝对路径)  //逻辑错误

3 Shell 变量

变量是会变化的值,不会变化的是常量

3.1 Shell 变量的类型

  • 自定义变量:由用户自己定义,修改和使用
  • 环境变量:由系统维护,用于设置工作环境
  • 只读变量:只可以读取不可以更改
  • 位置变量:通过命令行给脚本传递参数
  • 预定义变量:Bash 中内置的一类变量,不能修改
    环境变量、只读变量、位置变量、预定义变量都是属于特殊变量

系统内置变量:PATH,UID,HOSTNAME,USER

3.2 变量的作用

  • 用来存放系统和用户需要使用的特定参数(值)
  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

3.3 命名要求

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

3.4 自定义变量

格式:变量名=变量值   
#'=' 为赋值,
变量名:数字,字母,下划线组成,不能以数字开头,区分大小写,不能是特殊符号
echo $变量名   //查看变量的值

3.4.1 echo用法

-n输出字符串不换行
-e处理某些特殊符号
[root@localhost ~]# echo -n "hello"
hello[root@localhost ~]#

[root@localhost ~]# echo -e "hello\c"
[root@localhost ~]# echo -e "hello\n"
\c #输出字符串不换行
\n #输出字符串换行,并增加一行空行

[root@localhost ~]# echo -e "\e[33mhello\e[0m"
"\e[33m黄色\e[0m"#将字符串设为黄色字体

[root@localhost ~]# unset name    //取消变量

在这里插入图片描述
举例一

[root@localhost ~]# name=fyr  //创建临时变量
[root@localhost ~]# echo $name   //查看变量值

[root@localhost ~]# name=feng
[root@localhost ~]# echo $name

[root@localhost ~]# producet=centos
[root@localhost ~]# version=7
[root@localhost ~]# echo $producet$version
[root@localhost ~]# echo ${producet}7

在这里插入图片描述

3.4.2 赋值时使用引号

  • 双引号(" "):允许通过 $ 符号引用其他变量值
  • 单引号(’ '):禁止引用其他变量值, $视为普通字符
  • 反撇号(在tab上面):命令替换,提取命令执行后的输出结果,``和$(…)作用相同
    在这里插入图片描述
    案例一:创建变量使用符号
[root@localhost ~]# b="hello world"
[root@localhost ~]# echo $b

[root@localhost ~]# bb=hello\ world
[root@localhost ~]# echo $b

在这里插入图片描述
案例二:``引用结果等于$()

[root@localhost ~]# echo `date`

[root@localhost ~]# a=`date`
[root@localhost ~]# echo $a

[root@localhost ~]# a=$(date)
[root@localhost ~]# echo $a

在这里插入图片描述

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

read读取输入

[root@localhost ~]# read -p "请输入你的名字:" name   //-p添加注释
[root@localhost ~]# echo $name

[root@localhost ~]# read -n5 -p "请输入你的名字:" name    //-n5 表示变量值限制为五个字符
[root@localhost ~]# echo $name

[root@localhost ~]# read -s -p "请输入你的passwd:" pass   //-s静默模式,隐藏变量值
[root@localhost ~]# echo $pass

在这里插入图片描述
read在脚本中使用

[root@localhost ~]# vim name.sh
[root@localhost ~]# bash name.sh

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

3.4.4 设置变量的作用范围

可以使用 pstree 命令查看Shell环境,输入 bash 命令进入子Shell环境,
按Ctrl+D组合键或输入 exit 命令退出子Shell环境
在这里插入图片描述
使用bash命令进入子Shell环境
在这里插入图片描述
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时,局部变量将无法再使用

可以通过内部命令 export 将指定的变量导出为全局变量,使用户定义的变量在所有的子 Shell 环境中能够继续使用

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

在这里插入图片描述

3.4.5 整数变量的运算

格式:expr 变量1 运算符 变量2 [运算符 变量3]...
expr不可计算小数,并且变量和运算符之间需要空格分隔

常用运算符

  • 加法运算:+
  • 减法运算:-
  • 乘法运算:*(计算乘法时,需要使用 “” 转义符)
  • 除法运算:/
  • 求模(取余)运算:%(取余只需要除后的余数)
    在这里插入图片描述
    在这里插入图片描述
    案例一:从1+100的结果
[root@localhost ~]# seq -s+ 100|bc

在这里插入图片描述
案例二:使用let

[root@localhost ~]#a=2
[root@localhost ~]#b=3
[root@localhost ~]#z=0;let z=a+b;echo $z

在这里插入图片描述
案例三:随机取余

[root@localhost ~]#expr $RANDOM%33
[root@localhost ~]#expr $[RANDOM%10+1]
[root@localhost ~]#echo $[RANDOM%10+1]

在这里插入图片描述
案例四:i++和++i的区别

[root@localhost ~]# i=100;let j=i++;echo $i $j
[root@localhost ~]# i=100;let j=++i;echo $i $j
i++是先赋值给j后再加,++i是加后再赋值

在这里插入图片描述
案例五:用脚本写个计算器

[root@localhost ~]# vim bc.sh
[root@localhost ~]# chmod +x *.sh
[root@localhost ~]# ./bc.sh

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

4 特殊的 Shell 变量

4.1 环境变量

由系统提前创建,用来设置用户的工作环境
配置文件:/etc/profile(全局生效)、~/.bash_profile(当前用户环境)

常见环境变量

  • PWD、PATH
  • USER、SHELL、HOME

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

PATH(路径环境变量)

[root@localhost ~]# env  //查看系统所有环境变量
[root@localhost ~]# echo $HOME   //查看单个环境变量

4.1.1 创建临时全局变量

[root@localhost ~]# echo $PATH					//查看当前搜索路径
[root@localhost ~]# PATH="$PATH:/root"			 //将/root目录添加到搜索路径
[root@localhost ~]# export PATH="$PATH:/root"	//输出为全局环境变量

在这里插入图片描述
已经将该目录添加到路径环境变量中,目录内的所有具有执行权限的文件,都可以在当前环境任何目录中执行

4.1.2 创建永久全局变量—/etc/profile

[root@localhost ~]# vim /etc/profile   //进入全局变量配置文件
[root@localhost ~]# source /etc/profile   //当前shell环境执行此文件
[root@localhost ~]# echo $PATH

在这里插入图片描述

4.2 只读变量

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

readonly 命令设置只读变量
readonly PRODUCT	   //设置为只读变量
echo $PRODUCT
PRODUCT=Python		//只读变量不可以被重新赋值
unset PRODUCT		//只读变量不可以被删除,unset 命令用于删除变量,但无法删除只读变量,只能重启系统解决

案例

[root@localhost ~]# f=zhangsan
[root@localhost ~]# readonly f
[root@localhost ~]# echo $f
[root@localhost ~]# f=lisi

在这里插入图片描述

4.3 位置变量

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

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

4.4 预定义变量

  • $*:表示所有位置参数的内容看成一个整体返回,返回所有
  • $@:把各个参数加上双引号分隔成n份的参数列表,每个参数是独立 的,代表"$1" “$2” “$3” “$4”
  • $?:表示前一条命令或脚本执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值
  • $#:表示命令或脚本要处理的参数的个数
  • $0:表示当前执行的脚本或程序的名称
  • $$:当前进程id
  • $!:后台任务最后一个id
    在这里插入图片描述

5 总结

1、shell 编程规范:以 #!/bin/bash(shell 解释器)
#开头代表注释
命令或者表达式

2、执行脚本的方式

① 工作目录执行即当前目录(需要x权限)
工作目录执行,指的是执行脚本时,先进入到脚本所在的目录,然后使用 ./脚本方式执行

② 绝对路径执行(需要x权限)
绝对路径中执行,指的是直接从根目录/到脚本目录的绝对路径
① 和 ② 路径 + 脚本名 (需要权限),路径分为绝对路径和相对路径

③ sh执行
sh执行,指的是用脚本对应的sh或bash来接着脚本执行
bash  sh  绝对路径  相对执行 执行的脚本  会创建一个子shell环境,并在这个子shell环境中执行这个脚本

④ shell环境执行
shell环境执行,指的是在当前的shell环境中执行,可以使用 . 接脚本 或 source 接脚本(不建议使用)

3、Shell变量

  • 自定义变量,位置变量,预定义变量
  • 环境变量,只读变量
    自定义变量
赋值:
定义变量的方法:
① 变量名=变量值
② read 变量名   //从键盘输入内容为变量赋值
read -p "提示内容"  变量名
③ vim /etc/profile   //输出全局变量
number=43zhangsan
export number
source /etc/profile   //加载

删除:unset 变量名
调用:echo $变量名

位置变量

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

./first.sh one two three four five  ......   10 ....  20
     $0    $1  $2  $3     $4  $5             ${10}  ${20}

"one two three four five"             $*  数量为 1
"one" "two" "three" "four" "five"     $@  数量为 5

预定义变量

$0   代表脚本本身
$#   代表脚本后面跟的参数(位置变量)的个数
$*   不加双引号的话 $*$@都代表脚本后面跟的所有参数,加上双引号 "$*" 会把所有参数当做一个整体的参数(此时参数数量为1)去看待
$@   加上双引号 "$@"  会把脚本后面跟的每一个参数当做一个个体去看待
$?   代表上一条命令或者脚本执行后返回的状态码,返回值为0表示执行正确,为非0值表示执行异常
     return 退出函数时获取的返回值(0-255,超过部分 %256 取余)

4、运算

#整数运算
i=$(expr 12 \* 5)    变量和运算符之间需要空格分隔(计算乘法时,需要使用 " \ "转义符)
i=$((12*5))      变量和运算符之间可以不加空格分隔
i=$[12*5]
let i=12*5   运算符两边不可以用空格分隔

let i++   i=$[$i+1]
let i--   i=$[$i-1]
let i+=2  i=$[$i+2]
let i/=2  i=$[$i/2]

#浮点数运算
echo "字符串" | bc   
awk 'BEGIN {print 浮点运算字符串}'

5、赋值时使用引号

赋值时使用双引号("")可以直接调用变量--强引用
赋值时使用单引号('')$只会被认为是字符$不会调用变量--弱引用
赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结果 $() 用法相同--调用命令等于$()
{}可以分隔变量值--隔离变量范围

6、linux主要配置文件
/etc/profile /etc/bashrc /root/.bash_profile /root/.bashrc

  • /etc/profile 设置的是系统全局环境和登录系统的一些配置,该配置对所有用户生效;(需要用source /etc/profile加载)
  • /etc/bashrc 是shell 全局自定义配置文件,主要用于自定义 shell,该配置对所有用户的shell都生效;
  • /root/.bashrc 用于单独自定义root用户的 bash,只对root用户的bash生效,如果要使elk用户生效,则需要配置/home/elk/.bashrc文件;
  • /root/.bash_profile 用于单独自定义root用户的系统环境,只对root用户生效,如果要使elk用户生效,则需要配置/home/elk/.bash_profile。

./etc/profile 、/etc/bashrc这两个配置文件是全局配置文件,对所有用户生效;/username/.bashrc 、/username/.bash_profile是局部配置文件,只对单个用户生效。

系统每次启动都会自动执行 /etc/profile 文件里的命令,这个文件是对全局有效的(所有的shell环境和用户)
不同用户登录系统 会自动执行 自己家目录中的 ~/.bash_profile 文件中的命令,自动执行 ~/.bashrc
~/.bashrc 当前用户每切换一个shell环境都会自动执行,执行 /etc/bashrc
/etc/bashrc 针对所有用户的,用户每切换一个shell环境都会自动执行

举报

相关推荐

Shell编程规范与变量

shell编程规范与变量

Shell脚本编程规范与变量

shell脚本的编程规范与变量

Shell编程规范及变量

Shell编程与变量

Shell编程规范

Shell脚本基本编程与变量

0 条评论