Linux筑基-Shell脚本基础一、Shell 脚本简介Shell 脚本是一种解释型编程语言它将一系列命令写入文本文件通过 Shell 解释执行。Shell 脚本可以自动化日常任务、批量处理文件、管理系统等。默认的 Shell 是 BashBourne Again Shell脚本通常以#!/bin/bash开头指定解释器。二、脚本结构1. shebang 行脚本的第一行通常是#!/bin/bash告诉系统使用哪个解释器执行此脚本。其他可能的 shebang#!/bin/sh使用 Bourne Shell#!/usr/bin/env bash更灵活从环境变量找 bash2. 注释以#开头的行是注释不会被解释执行。注释可以单独一行也可以在命令后面命令后加空格再#。bash# 这是一个注释 echo Hello # 这也是注释3. 执行脚本给脚本添加执行权限chmod x script.sh执行./script.sh或bash script.sh三、变量1. 定义变量bashnameJohn # 等号两边不能有空格 age25变量名区分大小写通常大写用于环境变量小写用于自定义变量。2. 使用变量在变量名前加$bashecho $name echo My name is ${name} # 推荐用花括号包裹避免歧义3. 只读变量bashreadonly PI3.144. 删除变量bashunset name5. 环境变量环境变量是全局的可供子进程继承。定义环境变量bashexport PATH$PATH:/my/new/path常用环境变量PATH、HOME、USER、SHELL等。6. 位置参数在脚本中可以通过$1,$2, …,${10}获取传递给脚本的参数。$0脚本名称$#参数个数$*或$所有参数区别在于引号内的行为$?上一条命令的退出状态码0 表示成功非0 表示失败$$当前脚本的 PID$!后台运行的最后一个进程的 PID示例脚本test.shbash#!/bin/bash echo 脚本名: $0 echo 第一个参数: $1 echo 参数个数: $# echo 所有参数: $执行./test.sh a b c输出相应信息。7. 命令替换将命令的输出赋值给变量bashcurrent_date$(date) # 推荐写法 current_datedate # 旧写法反引号8. 算术运算使用$(( ))进行整数运算basha10 b20 sum$((a b)) echo $sum其他运算-、*、/、%取余、**幂。四、输入输出与重定向1. echo 输出bashecho Hello, World! echo -n 不换行输出 # -n 取消末尾换行 echo -e 包含\t转义符 # -e 启用转义如 \t 制表符2. read 输入从标准输入读取用户输入bashread -p 请输入你的名字: name echo 你好, $name选项-p提示信息-s静默模式输入密码不显示-t超时时间-n读取字符数3. 重定向将输出写入文件覆盖将输出追加到文件从文件读取输入2重定向错误输出重定向所有输出stdout 和 stderr21将 stderr 合并到 stdout示例bashls filelist.txt # 列表写入文件 ls /nonexist 2 error.log # 错误信息写入 error.log ls all.log 21 # 标准输出和错误都写入 all.log五、条件判断1. test 命令和 [ ]test命令用于检查条件等价于[ ]注意方括号两边要有空格。常用测试类型数值比较-eq等于、-ne不等、-gt大于、-lt小于、-ge大于等于、-le小于等于字符串比较等于、!不等、-z字符串为空、-n字符串非空文件测试-e文件存在、-f是否为普通文件、-d是否为目录、-r可读、-w可写、-x可执行示例bash# 数值 [ $a -eq $b ] echo 相等 # 字符串 [ $name John ] echo Hello John # 文件 [ -f /etc/passwd ] echo 文件存在2. if-then-else 结构bashif condition; then commands elif another_condition; then commands else commands fi注意then可以和if写在同一行用分号分隔。示例bash#!/bin/bash read -p 输入一个数字: num if [ $num -gt 10 ]; then echo 数字大于10 elif [ $num -eq 10 ]; then echo 数字等于10 else echo 数字小于10 fi3. 逻辑运算符与and||或or!非示例bash[ $a -gt 5 ] [ $a -lt 10 ] echo a在5到10之间六、循环1. for 循环遍历列表bashfor var in list; do commands done列表可以是空格分隔的单词、数组、命令替换等。示例bash# 遍历数字 for i in 1 2 3 4 5; do echo Number: $i done # 遍历文件 for file in *.txt; do echo 处理文件: $file done # C 风格 for 循环 for (( i0; i5; i )); do echo $i done2. while 循环当条件为真时执行bashwhile condition; do commands done示例bashcount1 while [ $count -le 5 ]; do echo Count: $count ((count)) done3. until 循环与 while 相反条件为假时执行bashuntil condition; do commands done4. break 和 continuebreak跳出循环continue跳过本次循环剩余部分进入下一次迭代七、函数可选补充函数可以将重复代码封装起来提高脚本的可读性和复用性。定义函数bashfunction_name() { commands [return value] }或bashfunction function_name { commands }调用函数直接写函数名即可。参数传递函数内部使用$1,$2等获取传入的参数。返回值使用return返回整数状态码0-255可通过$?获取。若要返回字符串可以使用echo捕获。示例bash#!/bin/bash say_hello() { echo Hello, $1! } say_hello Alice八、脚本调试bash -x script.sh逐行显示执行过程加号开头在脚本中插入set -x开启调试set x关闭bash -n script.sh仅检查语法错误不执行九、实操任务环境准备任何 Linux 环境普通用户即可。任务清单编写第一个脚本创建hello.sh写入以下内容bash#!/bin/bash echo Hello, World!添加执行权限并运行。使用变量和位置参数编写脚本greet.sh接受一个名字作为参数输出 “Hello, [名字]!”。如果没有提供参数提示用户输入名字。示例输出./greet.sh Alice→Hello, Alice!数值计算编写脚本calc.sh接受两个整数作为参数输出它们的和、差、积、商整数除法。条件判断练习编写脚本check_file.sh接受一个文件名作为参数判断文件是否存在若不存在则输出不存在。若存在判断是普通文件还是目录并输出相应信息。若为普通文件判断是否可读、可写、可执行。循环练习编写脚本sum.sh计算 1 到 100 的和并输出结果。编写脚本backup.sh将当前目录下所有.txt文件备份到backup目录需先创建文件名加上日期后缀如file_20250313.txt。使用for循环遍历.txt文件。使用date %Y%m%d获取当前日期。综合练习编写脚本menu.sh实现一个简单的菜单text1. 显示当前日期时间 2. 显示当前目录下的文件列表 3. 显示当前登录用户 4. 退出使用read读取用户选择用case语句补充知识点实现分支。重定向练习运行一个命令将其标准输出和错误输出分别重定向到不同文件。将ls命令的输出追加到一个日志文件。十、面试常见问题与解答Shell 脚本第一行#!/bin/bash的作用是什么指定脚本的解释器路径。当直接执行脚本时系统会使用该解释器运行脚本内容。如何定义和使用变量变量名的命名规则定义varvalue等号两边无空格。使用$var或${var}。变量名只能包含字母、数字和下划线不能以数字开头。$?表示什么上一条命令的退出状态码。0 表示成功非0 表示失败。如何从脚本外部传递参数通过位置参数$1,$2, … 访问。$0是脚本名$#是参数个数$是所有参数。test命令和[ ]有什么区别二者等价都是用于条件测试。[实际上是test命令的另一种形式使用时必须注意空格。如何判断一个文件是否存在且为普通文件[ -f $file ]或test -f $file。Shell 脚本中如何进行算术运算使用$(( ))例如sum$((a b))。也可用let命令但推荐前者。for循环和while循环的区别for通常用于遍历列表或固定次数的循环while用于条件控制的循环只要条件为真就一直执行。如何让脚本接收用户输入使用read命令例如read -p 提示信息 variable。如何将命令的输出赋值给变量使用命令替换var$(command)或varcommand。什么是环境变量如何定义环境变量环境变量是可供子进程继承的变量。使用export VARvalue定义。如何调试 Shell 脚本使用bash -x script.sh或在脚本中添加set -x开启调试模式。写出一个脚本检查当前目录下是否存在backup目录若不存在则创建。bash#!/bin/bash if [ ! -d backup ]; then mkdir backup echo backup 目录已创建 else echo backup 目录已存在 fi如何比较两个字符串是否相等使用[ $str1 $str2 ]注意等号两边空格变量最好加引号。和的区别覆盖写入文件追加到文件末尾。Shell 脚本中如何注释多行Bash 没有原生多行注释但可以用: COMMENT ... COMMENT或每行前加#。