Shell脚本编程基础:从零开始构建你的第一个脚本
一、Shell脚本的创建与执行
1.1 什么是Shell脚本
Shell脚本本质上是一个包含多个命令的文本文件。Shell会按顺序依次执行文件中的每一条命令,从而实现将多个命令串联起来完成复杂任务的目的。你可以把多个命令放在同一行,彼此间用分号(;)隔开,也可以分行书写。
bash
date ; who
date | who
1.2 创建Shell脚本文件
创建Shell脚本需要使用文本编辑器(如vim)来创建一个以.sh为后缀的文件。关键步骤是:必须在文件的第一行指定要使用的Shell解释器,格式为:
bash
#!/bin/bash
说明:#通常用作注释,而#!则是特殊标记,用来告诉系统用哪个Shell程序来运行该脚本。
创建示例:
bash
vim test.sh
在test.sh中输入以下内容:
bash
#!/bin/bash
echo “Hello, Shell!”
date
who
1.3 执行Shell脚本
创建好脚本后,有两种执行方式:
方法一:使用bash命令调用(不需要执行权限)
bash
bash test.sh
这种方式的本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。
方法二:使用路径直接执行(需要执行权限)
bash
/home/zhang/test.sh
./test.sh
新创建的脚本默认没有执行权限,直接运行会遇到Permission denied错误。需要先赋予可执行权限:
bash
chmod +x test.sh
然后就可以执行了:
bash
./test.sh
注意:使用./执行时,脚本必须具有可执行权限(x)。在生产环境中,不要轻易给文件赋予可执行权限。
echo命令——显示消息
echo命令用于将文本消息输出到控制台显示器,是Shell脚本中最常用的输出命令之一。
基本用法
bash
#!/bin/bash
echo “Hello World”
echo -n:不换行输出
使用-n选项可以取消输出内容后的换行符,将文本字符串和命令输出显示在同一行中:
bash
#!/bin/bash
echo -n “当前时间是:”
date
输出结果:
text
当前时间是:2026年 07月 09日 星期四 10:30:25 CST
三、Shell脚本中的变量
变量允许你在Shell脚本中临时存储信息,以便和脚本中的其他命令一起使用。
3.1 使用环境变量
在变量名称前加上美元符($)来引用环境变量:
bash
#!/bin/bash
echo “当前用户:USER"echo"当前路径:USER" echo "当前路径:USER"echo"当前路径:PWD”
echo "主目录:HOME"关于HOME" 关于HOME"关于的转义:当需要在引号中原样输出美元符加变量名称(而不是变量值)时,可以在美元符前放置反斜线(\)进行转义:
bash
#!/bin/bash
echo “我的家目录是:$HOME” # 输出:我的家目录是:HOMEecho"我的家目录是:HOME echo "我的家目录是:HOMEecho"我的家目录是:HOME" # 输出:我的家目录是:/home/username
3.2 自定义变量
Shell脚本允许用户自己定义并使用变量。用户定义的变量规则如下:
可以由字母、数字或下划线组成
长度不超过20个字符
区分大小写
使用等号(=)赋值,变量、等号和值之间不能出现空格
bash
#!/bin/bash
name=“张三”
age=20
score=95.5
echo “姓名:name"echo"年龄:name" echo "年龄:name"echo"年龄:age”
echo “成绩:$score”
重要:当你退出脚本后,在Shell命令行中无法直接调用脚本内定义的变量——这些是局部变量,只在脚本运行期间有效。
3.3 命令替换——将命令输出赋给变量
Shell脚本中最有用的特性之一是可以从一个命令的输出中提取信息,并将其赋给变量。有两种方法可以实现:
方法一:反引号(`)
bash
current_date=date
echo "当前日期:currentdate"方法二:current_date" 方法二:currentdate"方法二:() 格式(推荐)
bash
current_date=(date)echo"当前日期:(date) echo "当前日期:(date)echo"当前日期:current_date"
推荐使用$():它更易读,且支持嵌套使用。反引号是旧语法,可读性较差,容易与单引号混淆。
实际应用示例——生成唯一文件名:
bash
#!/bin/bash
date_suffix=KaTeX parse error: Expected group after '_' at position 32: …ilename="backup_̲{date_suffix}.log"
echo “生成的文件名:$filename”
+%Y%m%d格式告诉date命令将日期显示为两位数的年月日组合(例如:20260709)。
四、wc命令——统计文件内容
wc(word count)命令用于统计文件中的文本数据。默认情况下,它会输出三个值:
文本的行数
文本的词数
文本的字节数
基本用法
bash
wc test.txt
wc -l test.txt
wc -l *.sh
在脚本中使用
bash
#!/bin/bash
line_count=$(wc -l < “$0”)
echo “本脚本共有 $line_count 行”
五、Shell脚本中的数学运算
Bash Shell本身只支持整数运算。如果需要浮点数运算,需要使用bc命令。
5.1 使用expr命令
expr命令可以进行算术运算并返回结果。
基本格式:
bash
expr 操作数1 操作符 操作数2
注意事项:
操作符与数字之间必须有空格
乘法运算符(*)需要加反斜杠转义
bash
#!/bin/bash
result1=expr 5 + 3
result2=expr 10 - 4
result3=expr 5 \* 3
result4=expr 20 / 4
result5=expr 10 % 3
echo “5+3=result1"echo"10−4=result1" echo "10-4=result1"echo"10−4=result2”
echo “5*3=result3"echo"20/4=result3" echo "20/4=result3"echo"20/4=result4”
echo “10%3=$result5”
expr支持的操作符:
操作符 说明
OP1 + OP2 加法
OP1 - OP2 减法
OP1 * OP2 乘法(需转义)
OP1 / OP2 除法
OP1 % OP2 取余
OP1 > OP2 大于(需转义)
OP1 < OP2 小于(需转义)
OP1 = OP2 等于
5.2 使用方括号
[
]
或双括号
[]或双括号(( ))
$[ ] 格式:
bash
#!/bin/bash
result=[5+3]result2=[5 + 3] result2=[5+3]result2=[10 - 4]
result3=[5∗3]result4=[5 * 3] result4=[5∗3]result4=[20 / 4]
echo “5+3=result"echo"10−4=result" echo "10-4=result"echo"10−4=result2”
echo “5*3=result3"echo"20/4=result3" echo "20/4=result3"echo"20/4=result4”
使用变量进行运算:
bash
#!/bin/bash
num1=10
num2=20
sum=[[[num1 +num2]echo"sum=num2] echo "sum=num2]echo"sum=sum"
$(( )) 格式:
bash
#!/bin/bash
result=$((5 + 3))
echoresultresult=result result=resultresult=(( (1 + 2) * 3 ))
echoKaTeX parse error: Expected 'EOF', got '#' at position 10: result #̲ 输出:9 注意:[]和$(())都不需要转义符,也不需要注意空格问题。但两者都只支持整数运算。
5.3 使用bc进行浮点数运算
当需要进行浮点数(小数)计算时,就需要使用bc命令。
在命令行中使用bc:
bash
bc
3.14 * 2
scale=4
10 / 3
quit
在脚本中使用bc:
基本格式:
bash
variable=$(echo “options; expression” | bc)
其中:
options:设置变量值格式(如scale=2表示保留2位小数)
多个选项用分号(;)分开
expression:要执行的数学表达式
示例:
bash
#!/bin/bash
result=(echo"scale=2;10/3"∣bc)echo"10/3=(echo "scale=2; 10 / 3" | bc) echo "10/3=(echo"scale=2;10/3"∣bc)echo"10/3=result"
result2=(echo"scale=4;22/7"∣bc)echo"22/7=(echo "scale=4; 22 / 7" | bc) echo "22/7=(echo"scale=4;22/7"∣bc)echo"22/7=result2
num1=3.14
num2=2.5
result3=(echo"(echo "(echo"num1 *num2"∣bc)echo"num2" | bc) echo "num2"∣bc)echo"num1 * $num2 = $result3"
注意:bc中的scale变量用于指定小数点后的位数。如果系统没有安装bc,需要先安装:yum -y install bc。
六、退出状态码
Shell中运行的每个命令在结束时都会产生一个退出状态码(exit status),用于告诉Shell命令的执行结果。
6.1 什么是退出状态码
退出状态码是一个0~255的整数值
0 表示命令执行成功
1~255 表示命令执行失败或出现错误
6.2 使用?查看退出状态码Linux提供了特殊变量?查看退出状态码 Linux提供了特殊变量?查看退出状态码Linux提供了特殊变量?来保存上一个执行命令的退出状态码:
bash
ls /home
echo $? # 输出:0
ls /nonexistent
echo $? # 输出:非0值(如2)
6.3 在脚本中使用exit指定退出码
exit命令允许在脚本结束时指定一个退出状态码:
bash
#!/bin/bash
echo “脚本开始执行”
if [ -f “/etc/passwd” ]; then
echo “passwd文件存在”
exit 0 # 正常退出
else
echo “passwd文件不存在”
exit 1 # 异常退出
fi
示例:指定退出状态码为5
bash
#!/bin/bash
echo “执行完毕,退出码设为5”
exit 5
执行后,可以用echo $?查看退出状态码:
bash
bash test.sh
echo $? # 输出:5
注意:脚本的默认退出状态码是脚本中最后一个命令的退出状态码。建议使用exit命令明确指定退出状态码,以便其他程序判断脚本的执行结果。
七、综合练习题
根据课件要求,在Shell脚本中执行以下数学运算:
100 × (50 - 45)
100 ÷ 52
参考实现
使用$[]实现:
bash
#!/bin/bash
result1=$[100 * (50 - 45)]
echo "100 * (50 - 45) =result1"result2=result1" result2=result1"result2=[100 / 52]
echo "100 / 52 =result2"使用result2" 使用result2"使用(())实现:
bash
#!/bin/bash
result1=$((100 * (50 - 45)))
echo “100 * (50 - 45) = $result1”
result2=$((100 / 52))
echo “100 / 52 = $result2”
使用bc实现浮点数结果:
bash
#!/bin/bash
result1=$((100 * (50 - 45)))
echo “100 * (50 - 45) = $result1”
result2=$(echo “scale=4; 100 / 52” | bc)
echo “100 / 52 = $result2”
预期输出:
text
100 * (50 - 45) = 500
100 / 52 = 1 (整数除法,只保留整数部分)
使用bc时:
text
100 * (50 - 45) = 500
100 / 52 = 1.9230 (保留4位小数)
八、完整综合脚本示例
以下是一个综合了本文所有知识点的完整脚本:
bash
#!/bin/bash
1. echo命令 - 显示消息
echo “========== Shell脚本基础演示 ==========”
echo -n “脚本执行时间:”
date
2. 变量使用
echo -e “\n---------- 变量使用 ----------”
name=“Shell脚本学习者”
echo “欢迎,name!"echo"当前用户:name!" echo "当前用户:name!"echo"当前用户:USER”
echo “当前目录:$PWD”
3. 命令替换
echo -e “\n---------- 命令替换 ----------”
current_date=KaTeX parse error: Expected group after '_' at position 29: …) filename="log_̲{current_date}.txt"
echo “生成的文件名:$filename”
4. wc命令 - 统计行数
echo -e “\n---------- 统计行数 ----------”
line_count=$(wc -l < “$0”)
echo “本脚本共有 $line_count 行”
5. 数学运算
echo -e “\n---------- 数学运算 ----------”
使用expr
sum=expr 10 + 20
echo “expr: 10 + 20 = $sum”
使用$[]
product=$[10 * 20]
echo “$[]: 10 * 20 = $product”
使用$(())
div=$((100 / 3))
echo “$(()): 100 / 3 = $div”
使用bc(浮点数)
float_result=$(echo “scale=2; 100 / 3” | bc)
echo “bc: 100 / 3 = $float_result”
6. 退出状态码
echo -e “\n---------- 退出状态码 ----------”
echo “脚本执行完毕”
exit 0
九、知识点总结
知识点 关键命令/语法 说明
脚本创建 vim test.sh 第一行必须写#!/bin/bash
脚本执行 bash test.sh 或 ./test.sh 后者需要chmod +x权限
显示消息 echo / echo -n -n取消换行
引用变量变量名如变量名 如变量名如USER、$HOME
定义变量 变量名=值 等号两边不能有空格
命令替换命令或(命令)推荐使用(命令) 推荐使用(命令)推荐使用()
统计行数 wc -l 文件名 可配合命令替换使用
整数运算 expr、[]、[]、[]、(()) 注意expr需要空格和转义
浮点运算 echo “表达式” | bc 用scale=n控制小数位数
退出状态码 $?、exit n 0=成功,非0=失败
