【小知识】shell 脚本入门一,基础知识

973 阅读5分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

前言

我们在上一篇文章shell脚本工作原理浅析中对shell脚本工作方式及类型进行了解和学习。

shell 不仅是命令行解释器,还是程序设计语言,在日常需要需要重复步骤如上传代码、软件打包、编译等固定步骤,我们都可以使用shell来实现自动化脚本,把复杂的步骤简化成一键完成

shell 本身语法简单、上手快的特点,对于新手特别友好

因此,本期我们将开启学习shell语言之路,本期将学习shell相关的入门知识,Let's go~

1. shell 脚本第一行代码

#!/bin/bash

shell 脚本第一行需要添加此句话

2. shell 脚本执行方法

shell 脚本执行通常有4种,分别为 sh 执行、绝对路径执行、工作目录执行、sh环境执行

方式一. 使用 sh / bash 执行脚本

$ sh juejin.sh

方式二. 绝对路径执行

  • 执行前,需要对文件赋予可执行权限 使用 chmod a+x 文件名
  • 输入文件具体的绝对路径
$ chmod a+x juejin.sh
$ /Users/xxPath/xxPath/juejin.sh

方式三. 工作目录执行

  • 执行前,需要先进入到文件目录下
  • 执行:./脚本 方式执行
$ chmod a+x juejin.sh
$ cd /Users/xxPath/xxPath/
$ ./juejin.sh

方式四. sh 环境执行

  • 在shell 环境下,可以直接使用 .脚本 或者 source 脚本
$ . juejin.sh
$ source juejin.sh

3. shell 脚本打印信息

我们可以通过 echo string 来打印信息,终端默认显示白色

$ echo "Hello juejin..."	# 枯燥打印

终端打印的效果:

在终端中生成彩色输出还是比较好玩的,系统日志不看起来那么枯燥

shell 支持为输出的日志添加不同的颜色(字体颜色范围:30m~37m)

$ echo -e "\033[30m 黑色black \033[0m"
$ echo -e "\033[31m 红色red \033[0m"
$ echo -e "\033[32m 绿色green \033[0m"
$ echo -e "\033[33m 黄色yellow \033[0m"
$ echo -e "\033[34m 蓝色blue \033[0m"
$ echo -e "\033[35m 紫色purple \033[0m"
$ echo -e "\033[36m 天蓝sky-blue \033[0m"
$ echo -e "\033[37m 白色white \033[0m"

shell 支持输出的日志添加下划线

$ echo -e "\033[4;32m green \033[0m" # 绿色字体下添加下划线

诺不需要显示颜色,可以关闭所以属性

$ echo -e "\033[0m green \033[0m"  # 关闭属性

4. shell 脚本变量使用

shell 脚本变量的值都是字符串,不管给变量赋值时是不是使用的引号,值都是会以字符串形式存储。

在Bash shell 中默认情况下,不会区分变量类型,不会像其他高级语言那样区分整型、字符串等数据类型

shell 变量的命名规则与其他语言一样,遵循着PEP8规范

shell 定义变量时,以 变量名=值 形式。其中,当变量值为空时,则需要使用引号进行括起来(注意:等号两边不能出现空格

shell 变量使用时,以 变量明前面加上$,推荐同时使用{}包围变量名,例如如下案例

$ days1=1
$ echo $days1

🔔 单引号包围的变量:包含的内容就输出什么内容 🔔 双引号包围的变量:输出时会解析里面变量的和命令

我们想把一个命令的执行输出结果赋值给一个变量,可以通过反引号字符 `` 或 $() 的格式,比如

console:/data # log=`cat ext.txt``                                             
console:/data # echo ${log}                                                    
hello juejin
console:/data # log=$(cat text.txt)                                            
console:/data # echo ${log}                                                    
hello juejin
console:/data # 

5. shell 脚本数学运算

当我们在shell进行数据运算时,如果我们按照Python的写法的话,shell只会按原样输出,并不会进行计算

console:/data # echo 2+3
2+3
console:/data # echo $a+55
10+55

🔔 shell 变量不会区分类型,只会按照字符串的形式进行存储

在shell中,可以通过let(( ))[ ] 执行基本的算数操作

shell也提供高级操作方法,exprbc这两个工具也会很有用。

#!/bin/bash
num1=1
num2=2
# ------------------- 求和 -----------------
let sum=num1+num2
echo $sum
# ------------------- 自增/自减 -----------------
let num1++
echo $num1
let num1--
echo $num1
# ------------------- 加/减某个值 -----------------
let num1+=1	# 或let num1=num1+1
echo $num1
let num1-=1	# 或let num1=num1-1
echo $num1

# ---- 可以留意到,用let运算,操作变量不需要加$ ----
console:/data # source jue.sh
3
2
1
2
1
console:/data # 

🔔shell 本身只支持整数运算。

  • 当要进行整数运算时,我们可以使用let、(( ))、[ ]、expr方法

  • 当要进行浮点数和小数时,我们可以使用bc工具

console:/# echo "4 * 5.54" | bc
22.16

6. shell 普通数组

shell 数组创建有两种方式:

方式一:通过括号来数组,数组元素直接由空格来分隔

arr=(t1 t2 t3 t4)

🔔注意:数组元素之间不需要同种类型

方式二: 索引-值赋值

arr[0]="test1"
arr[1]="test2"
arr[2]="test3"
arr[3]="test4"
arr[4]="test5"

shell 数组元素打印

  • 打印单个元素
$ echo ${arr[1]} # 获取第2个元素
  • 打印所有元素,可以借助@或者*来获取数组的所有元素
echo ${arr[*]}
echo ${arr[@]}

shell 获取数组的长度

echo ${#arr[*]}
echo ${#arr[@]}

7. shell 关联数组(可以用字符串作为索引)

关联数组又称为字典,键值对的形式

关联数组的定义:declare -A ass_array

关联数组从Bash 4.0版本开始被引入,并非所有shell版本支持,看情况用吧

关联数组的赋值的两种方式:

方式一: 创建变量赋值时,键值对之间以空格分隔

declare -A ass_array 
ass_array=([name1]=ricky1 [name2]=ricky2)

方式二: 键值对的形式赋值

declare -A ass_array2 
ass_array2[name3]=ricky3
ass_array2[name4]=ricky4

关联数组打印内容:

  • 打印所有键值对的内容
echo ${ass_array[*]}
echo ${ass_array[@]}
  • 打印指定键的值
echo ${ass_array[name3]}

8. shell 调试脚本

我们在执行脚本时,期望能打印出所执行的每一行命令以及当前状态。

方式一:可以使用选项-x,启动shell脚本,

$ sh -x juejin.sh

方式二:指定需要打印所有行的执行情况,可以用:

set -x : 在执行时显示参数和命令

set +x : 禁止调试

arr=(hello jue jin yeah)
set -x
echo ${#arr[*]}
set +x
echo "hello juejin"

在上面的脚本中,仅在-x和+x所限制的区域内的调试信息才会被打印出来,打印结果如下:

9. shell 状态码

shell每个命令执行完后都有一个退出状态码,表示它已运行完毕,退出状态码是一个0~255的整数值。

在脚本中可以捕获上一个命令的状态码做一些逻辑处理。

Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码,使用演示:

console:/data # date
Sat Oct  9 14:40:07 +05 2021
console:/data # echo $?
0

一般命令成功执行时,退出状态码是0,如果命令结束时有错误,退出状态码一般是一个正数值,如:

$ asdfas
zsh: command not found: asdfas
$ echo $?
127

常见退出状态码以及描述(表格里的状态码我目前还没都遇到过,但127的退出状态码就比较容易常见了)

状态码描述
0命令成功执行
1一般性未知错误
2不适合的shell命令
126命令不可执行
127没找到命令
128无效的退出参数
130通过CTRL+C终止命令
255正常范围之外的退出状态码

那我们整份脚本文件运行结束的退出状态码呢?


Shell脚本会以脚本中的最后一个命令的退出状态码退出,你也可以改变这种默认行为,返回自己的退出状态码,exit命令就派上用场了:

#!/bin/bash
s1=1
s2=2
let sum=s1+s2
echo $sum
exit 100

假设上述代码为juejin.sh文件的脚本内容,则在终端的执行结果为:

$ sh juejin.sh
3
$ echo $?
100

如果我自定义的退出状态码大于前面的0~255的范围呢?

比如exit 500(将上述juejin.sh文件的exit 5改为exit 500),则输出结果为:

console:/ # sh juejin.sh
3
244|console:/ # echo $?
244

shell中会对最终结果除以256进行求模,500/256的模为244(即整除后的余数)

总结

本期,我们对shell脚本执行方法、变量创建传递、数组、关联数组等基本的语法使用进行系统地学习掌握

同时也对日常容易忽略细节的地方进行加强,比如定义变量时,等号两边不能有空格,否则无法对变量进行赋值的

以上是本期内容,欢迎大佬们点赞评论,我们下期见~❤️