脚本一:打印当前系统登录用户列表
#!/bin/bash
# 使用 who 命令获取当前登录用户信息并输出
who
解释:who
命令用于显示当前登录系统的用户信息,包括用户名、登录终端、登录时间等。此脚本直接执行 who
命令并将结果输出到终端。
脚本二:统计指定目录下的文件数量
#!/bin/bash
# 输入要统计的目录路径
read -p "请输入要统计文件数量的目录路径:" dir_path
# 使用 ls 命令列出目录下的文件,通过管道传递给 wc -l 命令统计行数,即文件数量
file_num=$(ls -l $dir_path | wc -l)
echo "目录 $dir_path 下的文件数量为:$file_num"
解释:首先提示用户输入目录路径,然后使用 ls -l
命令以长格式列出指定目录下的内容,再将输出通过管道传给 wc -l
命令,wc -l
会统计输入内容的行数,这里的行数就等于文件数量(包含隐藏文件),最后将结果输出。
脚本三:创建一个包含当前日期的日志文件并写入内容
#!/bin/bash
# 获取当前日期
current_date=$(date +%Y%m%d)
# 定义日志文件名
log_file="$current_date.log"
# 使用 echo 命令向日志文件写入内容
echo "这是一个日志文件示例,创建于 $current_date" > $log_file
echo "日志文件已创建:$log_file"
解释:先通过 date +%Y%m%d
获取当前日期并赋值给变量 current_date
,然后根据日期定义日志文件名。接着使用 echo
命令将包含日期信息的文本写入到日志文件中,最后输出日志文件创建成功的信息。
脚本四:备份指定文件到指定备份目录
#!/bin/bash
# 输入要备份的文件路径
read -p "请输入要备份的文件路径:" file_path
# 输入备份目录路径
read -p "请输入备份目录路径:" backup_dir
# 使用 cp 命令复制文件到备份目录
cp $file_path $backup_dir
echo "文件 $file_path 已备份到 $backup_dir"
解释:脚本先后提示用户输入要备份的文件路径和备份目录路径,然后使用 cp
命令将源文件复制到备份目录,最后输出备份成功的提示信息。
脚本五:查找系统中占用内存最多的前 5 个进程
#!/bin/bash
# 使用 ps 命令获取进程信息,按内存使用量排序,取前 5 个进程并输出
ps aux --sort=-%MEM | head -n 6
解释:ps aux
命令用于显示系统中所有进程的详细信息,--sort=-%MEM
表示按照内存使用量(%MEM
)降序排列,head -n 6
则取前 6 行(第一行是表头,后 5 行是占用内存最多的前 5 个进程信息)输出。
脚本六:批量重命名文件,将文件名中的特定字符串替换
#!/bin/bash
# 输入要处理的目录路径
read -p "请输入要处理文件的目录路径:" dir_path
# 输入要替换的旧字符串
read -p "请输入要替换的旧字符串:" old_str
# 输入要替换成的新字符串
read -p "请输入要替换成的新字符串:" new_str
# 遍历目录下的文件,使用 mv 命令重命名
for file in $dir_path/*; doif [ -f "$file" ]; thennew_file=$(echo $file | sed "s/$old_str/$new_str/g")mv $file $new_filefi
done
echo "文件重命名完成"
解释:先让用户输入目录路径、旧字符串和新字符串。然后遍历指定目录下的文件,对于每个文件,使用 sed
命令将文件名中的旧字符串替换成新字符串,得到新文件名,最后使用 mv
命令将原文件重命名为新文件名,全部处理完后输出完成信息。
脚本七:计算 1 到 100 的偶数之和
#!/bin/bash
# 初始化总和为 0
sum=0
# 循环遍历 1 到 100 的偶数并累加
for ((i = 2; i <= 100; i += 2)); dosum=$((sum + i))
done
echo "1 到 100 的偶数之和为:$sum"
解释:首先将变量 sum
初始化为 0,然后使用 for
循环从 2 开始,每次增加 2,直到 100,在循环中把每个偶数累加到 sum
变量中,最后输出偶数之和。
脚本八:检查网络连接是否正常
#!/bin/bash
# 使用 ping 命令测试网络连接,向百度服务器发送 4 个数据包
ping -c 4 www.baidu.com
# 根据返回值判断网络连接状态
if [ $? -eq 0 ]; thenecho "网络连接正常"
elseecho "网络连接异常"
fi
解释:使用 ping
命令向百度服务器发送 4 个数据包来测试网络连接情况。$?
是上一个命令的返回值,ping
命令正常返回时返回值为 0,如果返回值等于 0,则表示网络连接正常,否则表示网络连接异常,并输出相应信息。
脚本九:将文本文件中的每一行内容反转
#!/bin/bash
# 输入要处理的文本文件路径
read -p "请输入要处理的文本文件路径:" file_path
# 使用 tac 命令反转文件内容并输出
tac $file_path
解释:先获取用户输入的文本文件路径,然后使用 tac
命令对文件内容进行反转处理并输出。tac
命令的作用与 cat
相反,它会将文件内容从后向前输出,从而实现每行内容的反转。
脚本十:生成一个包含 10 个随机数的文件
#!/bin/bash
# 定义随机数范围
min=1
max=100
# 循环生成 10 个随机数并写入文件
for ((i = 1; i <= 10; i++)); dorandom_num=$((RANDOM % (max - min + 1) + min))echo $random_num >> random_numbers.txt
done
echo "随机数文件已生成:random_numbers.txt"
解释:首先定义随机数的范围,然后通过 for
循环 10 次,在每次循环中使用 RANDOM
环境变量生成一个在指定范围内的随机数,并将其追加写入到 random_numbers.txt
文件中,最后输出文件生成成功的信息。RANDOM
会生成一个 0 到 32767 之间的随机整数,通过取模和加法运算将其范围调整到指定的 min
到 max
之间。
以下是另外 10 个 shell 脚本:
脚本十一:删除指定目录下超过 7 天的临时文件
#!/bin/bash
# 输入要处理的目录路径
read -p "请输入临时文件所在目录路径:" dir_path
# 查找并删除超过 7 天的文件(以修改时间为准)
find $dir_path -type f -mtime +7 -delete
echo "已删除 $dir_path 目录下超过 7 天的临时文件"
解释:先让用户输入目录路径,然后使用 find
命令在该目录下查找类型为文件且修改时间超过 7 天的文件,并直接删除它们,最后输出删除完成的提示。
脚本十二:比较两个文件内容是否相同
#!/bin/bash
# 输入要比较的第一个文件路径
read -p "请输入第一个文件路径:" file1
# 输入要比较的第二个文件路径
read -p "请输入第二个文件路径:" file2
# 使用 diff 命令比较文件,根据返回值判断
if diff $file1 $file2 > /dev/null; thenecho "两个文件内容相同"
elseecho "两个文件内容不同"
fi
解释:获取两个文件路径后,使用 diff
命令比较它们。如果 diff
命令的输出重定向到 /dev/null
(空设备,即丢弃输出)后返回值为 0,说明文件内容相同,否则不同,并输出相应结果。
脚本十三:提取文件中的所有数字并求和
#!/bin/bash
# 输入要处理的文件路径
read -p "请输入文件路径:" file_path
# 使用 grep 提取数字,再用 awk 求和
sum=$(grep -oE '[0-9]+' $file_path | awk '{sum += $1} END {print sum}')
echo "文件中的数字总和为:$sum"
解释:先读取文件路径,然后用 grep -oE '[0-9]+'
提取文件中的所有数字,再通过管道将这些数字传给 awk
,在 awk
中累加这些数字并在结束时输出总和。
脚本十四:创建一个包含指定目录结构的备份目录
#!/bin/bash
# 输入要备份的源目录路径
read -p "请输入源目录路径:" source_dir
# 输入备份目录路径
read -p "请输入备份目录路径:" backup_dir
# 使用 mkdir -p 创建备份目录结构
mkdir -p $backup_dir/$(basename $source_dir)
echo "备份目录结构已创建:$backup_dir/$(basename $source_dir)"
解释:先获取源目录和备份目录路径,然后使用 mkdir -p
命令递归创建备份目录结构,其中 $(basename $source_dir)
用于获取源目录的基本名称(即最后一级目录名),最后输出创建成功信息。
脚本十五:监控指定进程的 CPU 使用率,每 5 秒输出一次
#!/bin/bash
# 输入要监控的进程名
read -p "请输入要监控的进程名:" process_name
# 循环监控,每 5 秒输出一次
while true; docpu_usage=$(ps -eo pcpu,comm | grep $process_name | awk '{print $1}')echo "$process_name 的 CPU 使用率:$cpu_usage%"sleep 5
done
解释:先让用户输入进程名,然后进入一个无限循环。在循环中,使用 ps -eo pcpu,comm
命令获取进程的 CPU 使用率信息,通过 grep
筛选出指定进程的信息,再用 awk
提取 CPU 使用率数值,最后输出并休眠 5 秒后再次循环。
脚本十六:将多个文本文件合并成一个新文件
#!/bin/bash
# 输入要合并的文件所在目录路径
read -p "请输入文件所在目录路径:" dir_path
# 定义合并后的文件名
merged_file="merged.txt"
# 使用 cat 命令合并文件
cat $dir_path/*.txt > $merged_file
echo "已将 $dir_path 下的文本文件合并到 $merged_file"
解释:先获取文件目录路径,定义合并后的文件名,然后使用 cat
命令将目录下所有 .txt
文件的内容合并到新文件中,最后输出合并完成信息。
脚本十七:统计指定目录下不同类型文件的数量
#!/bin/bash
# 输入要统计的目录路径
read -p "请输入目录路径:" dir_path
# 使用 find 和 awk 统计文件类型数量
find $dir_path -type f | awk -F '.' '{print $NF}' | sort | uniq -c | awk '{print $2 " 类型文件数量为:" $1}'
解释:先读取目录路径,然后使用 find
命令找出该目录下所有文件,通过管道将文件名传给 awk
,以 .
为分隔符提取文件扩展名,再经过排序、去重并统计数量,最后输出每种文件类型及其数量。
脚本十八:将文件中的大写字母转换为小写字母
#!/bin/bash
# 输入要处理的文件路径
read -p "请输入文件路径:" file_path
# 使用 tr 命令转换字母大小写
tr 'A-Z' 'a-z' < $file_path > new_$file_path
echo "已将文件 $file_path 中的大写字母转换为小写字母,新文件为 new_$file_path"
解释:先获取文件路径,然后使用 tr
命令将文件中的大写字母转换为小写字母,并将结果输出到一个新文件(文件名前加 new_
),最后输出转换完成信息。
脚本十九:查找指定目录下最大的文件
#!/bin/bash
# 输入要查找的目录路径
read -p "请输入目录路径:" dir_path
# 使用 find 和 sort 查找最大文件
find $dir_path -type f -exec du -h {} \; | sort -rh | head -n 1
解释:先让用户输入目录路径,然后使用 find
命令在该目录下查找所有文件,并使用 du -h
命令获取文件大小,通过管道将结果传给 sort -rh
按文件大小降序排列,最后用 head -n 1
取最大的文件信息并输出。
脚本二十:创建一个简单的 HTML 页面并写入内容
#!/bin/bash
# 定义 HTML 页面文件名
html_file="index.html"
# 定义页面内容
page_content="<html><body><h1>这是一个由 Shell 脚本创建的 HTML 页面</h1></body></html>"
# 使用 echo 写入内容到 HTML 文件
echo $page_content > $html_file
echo "HTML 页面已创建:$html_file"
解释:先定义 HTML 页面文件名和内容,然后使用 echo
将内容写入到文件中,最后输出创建成功信息。