小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。
前言
我们在上一篇文章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也提供高级操作方法,expr和bc这两个工具也会很有用。
#!/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脚本执行方法、变量创建传递、数组、关联数组等基本的语法使用进行系统地学习掌握
同时也对日常容易忽略细节的地方进行加强,比如定义变量时,等号两边不能有空格,否则无法对变量进行赋值的
以上是本期内容,欢迎大佬们点赞评论,我们下期见~❤️