Shell脚本攻略:Shell编程规范与变量

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、理论

1.Shell脚本编程规范

1Shell简介

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

291445ebd3284cb884213b0e51a22cb3.png

2Shell脚本的概念及处理逻辑

         ① Shell脚本

            1将要执行的命令按顺序保存到一个文本文件       

            2给该文件可执行权限
            3可结合各种Shell控制语句完成更复杂的操作

         ②  处理处理

              1顺序执行程序按从上到下的顺序执行

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

              3循环执行程序在执行过程中需要重复执行多次某些语句(根据已知次数、已知条件)

3Shell脚本的应用场景

         ① 重复性操作
         ② 交互性任务
         ③ 批量事务处理
         ④ 服务允许状态监控
         ⑤ 定时任务执行

4运行Shell脚本的四种方式

         调试阶段可以不赋权执行

         ① sh first.sh

e0b140641257420bb6de60ce605c1e63.png
         ② bash first.sh

9ef9ff08d02549c1acfd3a39ada2506b.png
         ③ source first.sh   全量查询结束自动切换目录 

55b6248180784ca3ab26cee550d0d69d.png

         正式上线必须赋权执行

         chmod 777 first.sh
         ④ ./first.sh

3e90bcb87f8a49259d5a3f70a50aaee3.png

3Shell的分类

shUNIX最初使用的 shell已经被bash所替换。
bash基准于GNU的框架下发展出的Shell是 sh 的扩展。/bin/bash是目前大多数 Linux 版本采用的默认 Shell。
csh语法有点类似于c语言的Shell。
tcsh整合了csh提供更多的功能。
nologin奇怪的shell这个shell可以让用户无法登录主机。

b8d8f22472724a2f93dcb2cfc8f4055c.png

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

5管道操作

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

6重定向交互式硬件设备

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

5重定向操作

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

2.Shell脚本变量揭秘

1变量的作用

变量用来存放系统和用户需要使用的特定参数值。

2自定义变量

      ① 定义新的变量

变量名使用固定的名称由系统预设或用户定义
      1不要使用系统的命令作为变量名
      2不要使用中文
      3不能特殊符号开头 可以用_来开头
      4在指定变量名的时候有一个默认的规则书本book 老师teacher a= b=
      5要有注释还要注意前后一致

变量值

      1整数型int

      2字符型string

      3)  布尔型boolean

      4浮点型float

      ② 查看和引用变量的值

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

ca272eafdefb4e1bb48a24f354995570.png

当变量名称容易和紧跟其后的其他字符混淆时需要添加大括号“{}”将其括起来否则将无法确定正确的变量名称。对于未定义的变量将显示空值。

ce77d46cf4d04bbeaafb7b3cbdab2316.png

      ③ 变量赋值的特殊操作

           1赋值时使用引号
           双引号允许通过$符号引用其他变量值。弱引用其中的变量引用会被替换为变量值
           单引号禁止引用其他变量值$视为普通字符。强引用其中的变量引用不会被替换为变量值而保持原字符串
           反撇号命令替换提取命令执行后的输出结果`…`和$(…)作用相同

9dc9f1be09664f03b81940281544a379.png

           2read命令

           read命令获取输入内容
           -p prompt指定提示符用于提示用户输入数据。
           -a array将输入数据存储到一个数组中。

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

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

          数组输入

          read -a 

995751cbd3484c0abd3f4b0a1bfc0a97.png

      ④ 设置变量的作用范围

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

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

全局变量格式1 export   变量名   

全局变量格式2export 变量名=变量值

      ⑤ 数值变量的运算

      1整数变量的运算
      格式expr 变量1 运算符 变量2 [运算符 变量3]
      运算符+ 加法、- 减法、\* 乘法、/ 除法、% 取余

094c0e1e10121c712f37b567fead6867.png

             2bc

             bc是一个简单易用的计算器程序可以用于执行基本的数学运算
包括加、减、乘、除和取余等操作。
在Shell编程中可以使用bc命令将数学表达式计算结果输出到标准输出或保存到文件中以满足不同的需求。

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

处理方式混合运算
bcf=$(echo "4.3+2.5"|bc)
echo "4.3+2.5=$f"
 
f=$(echo "4.3-2.5"|bc)
echo "4.3-2.5=$f"
f=$(echo "4.30*2.50"|bc)
echo "4.3*2.5=$f"
 
f=$(echo "scale=2;4.3/2.5"|bc)
echo "4.3/2.5=$f"
 
f=$(echo "2.2/(2.2-1.1)*2+1.1"|bc)
echo "2.2/(2.2-1.1)*2+1.1=$f"
awkf=$(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"

               4)备注

          变量名=$((表达式))  等价于  变量名=$(expr 表达式)   等价于    变量名=$[表达式] 

3特殊变量

     ① 环境变量

系统维护的变量用于设置工作环境使用env命令可以查看所有环境变量。

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

用户级环境变量 这些变量只对当前用户可见。每个用户可以定义自己的环境变量用于满足个人需求。
例如HOME变量指定了当前用户的主目录路径。

预定义环境变量 操作系统或应用程序预先定义了一些常用的环境变量用于提供特定的信息和功能。
例如USER变量保存当前用户名LANG变量指定了当前系统的默认语言。

自定义环境变量 用户和应用程序可以定义自己的环境变量用于存储特定的信息或配置。
这些变量可以根据需要随时创建、修改和删除。

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

$PWD 表示当前所在工作目录

$PATH 表示可执行用户程序的默认路径
 

     ② 位置变量

通过命令行给脚本传递参数主要指执行脚本时后面所跟着位置。

$1-$9脚本后1-9的位置

${10}脚本后10以上的位置需要借助变量分隔符{}不然会将$1认为是一个位置变量然后输出再加上后面的数字。

     ③ 预定义变量

系统已经定义好的变量

$*表示所有位置参数的内容看成一个整体返回

$@表示输出脚本后的所有位置参数且认为每个是独立的值

$0表示当前执行的脚本或程序的名称 当前脚本的名字

$#表示命令行中位置参数的总个数

$?表示前一条命令执行后的返回状态返回值为 0 表示上一条命令执行正确返回任何非 0值均表示执行出现异常。使用方法echo  $?

$!后台任务最后一个id,使用方法echo  $!

备注

$*、$@不加双引号时表现一致加双引号时$*会将所有参数作为一个整体。
 

      ④ 只读变量

       只可以读取不能修改的变量相当于常量用处较少。

       readonly 命令设置只读变量只读变量不可以被重新赋值、不可以被删除unset 命令用于删除变量。

f30552777270452384b019d79548a095.png

二、实验

1.shell脚本实现位置变量运算

1进入脚本

5f08255f4ccf4e8ba5fd863e84a3855e.png

2 将括号内num1与num2相加的执行结果赋值给变量sum

2912be2fc4bb4adaa1718ec331729ad2.png

 3执行脚本

a9d522ac23d3447d98739165f92b3b34.png

2.Shell脚本实现read命令

1进入脚本

58125c8cb64b4d7ea80adb4ff9452cff.png

 2编辑脚本

d872bc0844ab44eaa18d45aa07247827.png

3执行脚本

2142ab6426a74e17be983a9254f19dd8.png

 3.Shell脚本实现if条件判断

1进入文件

485150b8afc94b23aecec2f5696a1a48.png

2编辑文件

f5f2fcea118a48e6a6038e3006898a1d.png

3执行脚本

数字相同

e6c868373f3147ffa9386c8dadcaeab3.png

数字不同

71ce73f300e9463d9a41270934334b42.png

4.Shell脚本实现浮点运算

进行浮点运算需要借助bc,awk 处理。

加法

b444fe2a5a8646f5b4e092c70c6dafe2.png

减法:

4df094d84ae742b48ed2596102bf12c9.png

乘法

550d4eb4eb8943d2b327b035743cf806.png

除法

结果大于1

b773b1857f004aa28ffc83a99944ff45.png

结果小于1

97704af71d4f407db0da749929857c45.png

混合

 c9baeac8a3cb47f1a528212723d6e600.png

三、问题

1.Linux 执行命令为什么要加 ./点斜杠

1当前文件夹下有一个名为 first.sh 的 shell 脚本但是在执行它的时候却提示找不到文件

d045fc65925d47a4b6329d34c46735f8.png

2原因分析

虽然终端是在当前目录而且当前目录中有要执行的文件但是终端就是找不到它。需要指定文件的相对或绝对路径来告诉终端我们想运行的文件在哪里。

在 Linux 中点字符.表示工作目录斜杠/ 是 Linux 中的路径分隔符用它来分离工作目录.与文件名。为什么需要 ./ 因为我们的工作目录不包含在环境变量 $PATH 中。如果在路径名中存在 ./ 字符那么就不搜索 $PATH。如果 ./ 不在路径名中那么只在 $PATH 中搜索。

所以这就解释了为什么如果在 first.sh 前不加 ./ 就不能正常运行原因就是在环境变量中没有名为 first.sh 的命令。$PATH决定了shell将到哪些目录中寻找命令或程序$PATH的值是一系列目录当你运行一个程序时Linux 在这些目录下进行搜索。

3输入命令 echo $PATH 查看当前的环境变量。

db8f3482df1a4dd58862e8eb05ef002c.png

4在 Linux 上使用的命令都可以在这里面找到例如ls 命令。但是如果我们想看命令具体的位置可以使用 which 命令。

f96e9a767f594d83a97d94d051c69217.png

5在终端中输入export PATH=$PATH:/data这是一次临时的指定方法关闭终端之后就不再生效:

d6c0fec7887140a881f6fcb5a0b34bd6.png

6然后执行first.sh

6806d10bb7764d51bdf0c9ed3e978084.png

2. $() 与 ${}区别

1$()是将括号内命令的执行结果赋值给变量

94236ec7abb64c27b18d7c6c88f0f610.png

92742f7649554383bfb2e39bd217e6e4.png

2${} 是用来作变量替换。一般情况下$A 与 ${A} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围

653d65e569e2407d926e1734e287e47d.png

 3.cat 与echo区别

1cat 

cat命令只是看文本文档文件的命令二进制文件对于cat命令并不适用二进制文件的查看通常是反编译或者使用strings命令查看二进制文件的某些细节

cat命令并不适合查看大的文本文件比如超过200M大小的日志文件tail -f 适合查询日志

cat命令是Linux下的一个文本输出命令通常是用于观看某个文件的内容的

cat命令主要的应用在编辑生成配置文件查看配置文件通过管道符 |grep  提取关键的有用信息合并分片文件以及在脚本内传递参数变量这些功能由于管道符的配合加入使得cat命令的应用极为灵活多变。
cat主要有三大功能
     ① 一次显示整个文件。
      cat   filename

40cca817836b44ee847edb96a03aa95e.png
     ② 从键盘创建一个文件。
      cat  >  filename

a9ebd666d0fc4a458b2a1b2733b88224.png
      只能创建新文件,不能编辑已有文件.
     ③ 将几个文件合并为一个文件。
      cat   file   file2  > file3

38f6c586621b4b0abc4deb5f459ff2ea.png
 

2echo (回显)

echo命令的功能是在显示器上显示一段文字一般起到一个提示的作用。

echo 是一个专门输出自定义内容以及自定义和内置变量的值的命令类似于Python、java这样的编程语言的内置函数print的简化版命令。

在Linux中其实自定义内容也就是等于java的字符串通常加单引号或者双引号命令执行后返回字符串。在脚本编写进入调试阶段时通常需要在脚本内echo特定内容以判定脚本是否执行正确。

4.期待操作数报错

060b4344af8243ed90aee31e283472f4.png

解决方法

运算符左右2侧均需要空格。

4b9d58cb53b74986aebaccf814921563.png

命令后跟参数

ad07244ba79e4418abd70b30f2416886.png

 5.未预期的符号报错

129e774eabf6423fbc924f36938e6496.png

0bc71206edd942d9a742084583c91bf0.png

 解决方法

变量名称前添加前导符号“$”从而引用变量的值

d872bc0844ab44eaa18d45aa07247827.png

 6.未找到命令报错

e0f2388dee8c435986239a9c339c9591.png

cc19b57001c84e859ccef0486ad0e9dd.png

 解决方法

条件判断用“==”方括号[]内与调用变量间要有空格

6943d5da4b02444fa7331aaa5b47cde2.png

 7.bc运算

1减法结果显示不全

bc 作为强大而常用的计算工具做减法运算时如果结果值小于1小数前面的 0 是缺失的

 acf64d3c48f247b5872cea413ff52ff8.png

 8c0ecc73606648a1b1811feff090fc78.png

 解决方法

 %.1f表示保留到小数点后1位输出,补全0(%1f表示保留有效位数为1输出)

bd0957ac6c0945e0953e235538312d5e.png

b8c0c961111248448ece60d64e8a1b1b.png

2除法结果显示不全结果大于1

bc 作为强大而常用的计算工具做除法运算时如果结果值大于1小数后面是缺失的小数位后显示不全

433c585ee47f42dc9c769fe317163bfa.png

5b75a174102241838a6b4bb9c42c854e.png

 解决方法

scale保留运算结果到小数点后2位

962e67c2a10343ad821731cd3105380f.png

8aeb4e15221946dbbd90a51d831e95d7.png

3结果小于1

除法结果显示不全

bc 作为强大而常用的计算工具做除法运算时如果结果值小于1小数前面的 0 是缺失的小数位前显示不全

776ff648fe434bc5b35091f9ef5ae47f.png

37059a974fce4325bbe9c2638603d50b.png

解决方法

%.2f表示保留到小数点后2位输出,补全0

scale保留运算结果到小数点后2位

97704af71d4f407db0da749929857c45.png

 8a2323ef8f78437485164815147b173c.png

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: shell