Shell脚本基础语法入门教程
Shell脚本基础语法入门教程
本文将带你系统地学习Shell脚本的基础语法,从Shell的作用、脚本构成、执行方式,到重定向与管道符的使用,再到各种变量类型及其运算方法。通过本文的学习,你将掌握Shell脚本的基本知识,为更深入的学习打下坚实的基础。
一、Shell脚本基础
1. Shell的作用
Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的Shell解释器程序有很多种,使用不同的Shell时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells
文件可以了解当前系统所支持的Shell脚本种类。
# 查看本机shell
[root@LocalHost ~]# cat /etc/shells
Linux中脚本的用途:
- 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
- 减少手工命令的重复输入,一定程度上避免人为错误
- 将软件或应用的安装及配置实现标准化
- 用于实现日常性的、重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
2. Shell脚本的构成
- 脚本声明(解释器):
#!/bin/bash
表示此行以下的代码语句是通过/bin/bash
程序来解释执行。 - 注释信息:以
#
开头的语句表示为注释信息 - 可执行语句:比如
echo
命令用于输出“”之间的字符串
3. 脚本执行的方式
3.1 指定的Shell解释器(不需要脚本有执行权限)
[root@localhost opt]# bash test.sh # 直接用bash解释器去执行
3.2 路径的方式
[root@localhost opt]# ll test.sh
-rw-r--r-- 1 root root 129 11月 20 15:12 test.sh
[root@localhost opt]# chmod 777 test.sh # 加上执行权限
[root@localhost opt]# ll test.sh
-rwxrwxrwx 1 root root 129 11月 20 15:12 test.sh
[root@localhost opt]# /opt/test.sh # 绝对路径执行
[root@localhost opt]# ./test.sh # 相对路径执行
[root@localhost opt]# ln -s /opt/test.sh /usr/sbin/test.sh # 做软连接到$PATH中
[root@localhost opt]# test.sh # 直接作为可执行的外部命令执行
3.3 使用source和“.”执行脚本(不常用)
4. 脚本的错误
4.1 书写错误
bash -n
执行检测,不会影响后续命令执行
4.2 语法错误
bash -x
执行检测,会影响后续命令执行
4.3 逻辑错误
在脚本中建议加上set -e
(遇到错误的命令即终止,不再往下执行)
在脚本中建议加上set -u
(遇到变量赋值不正确,即终止)
二、重定向与管道符
1. 重定向
改变电脑的数据输出方向,默认是输在屏幕上
2. 重定向输入输出
3. 管道符
连接命令:管道符允许你将多个命令链接在一起,从而把一个命令的输出作为另一个命令的输入,而不需要中间存储结果。例如:
cat file.txt | grep "keyword"
提高效率:使用管道符可以避免在磁盘上临时保存数据。例如,处理大型数据时,可以直接将结果通过管道传递给下一个命令,而不需要将中间结果写入磁盘,减少了磁盘I/O操作,提高了处理效率。
简化命令:通过管道符,用户能够使用多个简单的命令组合来完成复杂的任务,而不需要编写复杂的脚本。例如:
ps aux | sort -rk 3,3
三、Shell脚本变量
1. 变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
[root@localhost opt]# echo $PATH # PATH为系统预设的变量名
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 变量值
2. 变量类型
2.1 自定义变量
定义变量:不需要指定类型,直接赋值即可
访问变量:需要在变量名前加上$
命名规则:
- 变量名只能包含字母、数字和下划线(_),但不能以数字开头。
- 变量名大小写敏感,myVariable 和 MYVARIABLE 是不同的。
- 读取用户输入:用read命令读取用户输入并存储在变量中
2.2 环境变量
环境变量由系统提前创建,用于设置用户的工作环境,可以使用env命令来查看环境变量,常用的环境变量有:
$USER
表示用户名称$HOME
表示用户的宿主目录$LANG
表示语言和字符集$PWD
表示当前所在工作目录$PATH
表示可执行用户程序的默认路径
子进程可以继承并使用父进程的变量,但父进程无法使用子进程的变量
同样,孙子进程也可以继承并使用子进程的变量,反之亦不可
2.3 只读变量
定义好的变量值不允许更改,最快的方式就是重启。
2.4 位置变量
$1-$n
表示参数的位置
2.5 预定义变量
$?
:返回上一次的执行结果,返回0为正确,返回其他值则是错误$$
:输出当前bash的pid号$0
:表示脚本的名称$#
:表示位置参数的总个数$@
:返回所有的参数,将参数逐个返回$*
:返回所有的参数,将参数当作一个整体一起返回$!
:返回上一次执行的进程pid号
3. 特殊符号
3.1 花括号
定义变量的范围
3.2 单引号(' ')
表示强引用,表示调用单引号的内容本身
3.3 双引号(" ")
表示弱调用,表示调用变量的值
3.4 反撇号(
)
表示调用命令的结果,等同于$(),可以调用命令执行的结果给变量赋值。
4. 整数运算和浮点数运算
整数运算使用的工具是let、expr、(())、[ ] 、( ),通常运算符有+ - * /。
Shell 默认不支持浮点数运算,因此需要借助外部工具如 bc(Basic Calculator)来进行浮点数计算。
4.1 let
变量值1=变量值2运算符变量值三(没有空格),例如:
同时,let运算支持自加和自减:
let a++
相当于a=$[a+1]
let a--
相当于a=$[a-1]
let a+=2
相当于a=$[a+2]
4.2 expr
变量1=expr 变量2 运算符 变量3
(注意空格)
使用
调用expr的运算结果,赋值给变量
4.3 expr
变量1=$(expr 变量2 运算符 变量3)(注意空格)
使用$()调用expr的运算结果,赋值给变量
4.4
变量1=$((变量2运算符变量3))
使用$()调用()的运算结果,赋值给变量
4.5
变量1=$[变量2运算符变量3]
使用[ ]调用变量的运算结果,赋值给新变量
4.6 浮点数运算
bc 是一个任意精度的计算器,可以用来处理浮点数计算,你需要指定浮点数的精度(使用 scale 变量)。例如:
#!/bin/bash
a=5
b=3
# 加法
result=$(echo "scale=2; $a + $b" | bc)
echo $result # 输出 8.00
# 减法
result=$(echo "scale=2; $a - $b" | bc)
echo $result # 输出 2.00
# 乘法
result=$(echo "scale=2; $a * $b" | bc)
echo $result # 输出 15.00
# 除法
result=$(echo "scale=2; $a / $b" | bc)
echo $result # 输出 1.66
# 取余(bc也支持模运算)
result=$(echo "$a % $b" | bc)
echo $result # 输出 2
在 bc 中,scale 变量指定了结果的小数点后保留的位数。需要注意的是,scale 只影响计算结果的精度,而不是操作数的精度。
4.7 随机数
想要随机产生一个数我们需要用到取余%和RANDOM
几个例子,我们想取一个5以内的随机数:
[root@localhost opt]# echo $[RANDOM%5]