shell脚本案例

脚本二十一:压缩指定目录为 tar.gz 格式

#!/bin/bash
# 输入要压缩的目录路径
read -p "请输入要压缩的目录路径:" dir_path
# 定义压缩包文件名
tar_file=$(basename $dir_path).tar.gz
# 使用 tar 命令进行压缩
tar -czvf $tar_file $dir_path
echo "已将目录 $dir_path 压缩为 $tar_file"

解释:先获取要压缩的目录路径,然后根据目录名生成压缩包文件名。接着使用 tar 命令的 czvf 选项,c 表示创建新归档,z 表示使用 gzip 压缩,v 表示显示详细信息,f 表示指定归档文件名,将指定目录压缩成 tar.gz 格式,并输出压缩完成信息。

脚本二十二:解压缩指定的 tar.gz 文件到当前目录

#!/bin/bash
# 输入要解压缩的 tar.gz 文件路径
read -p "请输入要解压缩的 tar.gz 文件路径:" tar_file_path
# 使用 tar 命令解压缩
tar -xzvf $tar_file_path
echo "已将文件 $tar_file_path 解压缩到当前目录"

解释:先读取要解压缩的 tar.gz 文件路径,然后使用 tar 命令的 xzvf 选项,x 表示从归档中提取文件,z 表示处理 gzip 压缩,v 表示显示详细信息,f 表示指定归档文件名,将文件解压缩到当前目录,并输出解压缩完成信息。

脚本二十三:在指定目录下创建一系列具有特定前缀的空目录

#!/bin/bash
# 输入要创建目录的父目录路径
read -p "请输入父目录路径:" parent_dir
# 输入目录前缀
read -p "请输入目录前缀:" prefix
# 输入要创建的目录数量
read -p "请输入要创建的目录数量:" num_dirs
# 循环创建目录
for ((i = 1; i <= num_dirs; i++)); do
    mkdir -p $parent_dir/$prefix$i
done
echo "已在 $parent_dir 下创建了 $num_dirs 个以 $prefix 为前缀的目录"

解释:先获取父目录路径、目录前缀和要创建的目录数量。然后使用 for 循环结合 mkdir -p 命令,mkdir -p 可以递归创建目录,创建一系列具有特定前缀的空目录,最后输出创建完成信息。

脚本二十四:计算指定目录下所有文件的总大小

#!/bin/bash
# 输入要计算文件总大小的目录路径
read -p "请输入目录路径:" dir_path
# 使用 du 命令计算总大小并输出
total_size=$(du -sb $dir_path | awk '{print $1}')
echo "目录 $dir_path 下所有文件的总大小为:$total_size 字节"

解释:先让用户输入目录路径,然后使用 du -sb 命令计算指定目录下所有文件的总大小,-s 表示只显示总计,-b 表示以字节为单位。再通过 awk 提取总大小数值并输出。

脚本二十五:将指定文本文件中的特定单词替换为另一个单词

#!/bin/bash
# 输入要处理的文本文件路径
read -p "请输入文本文件路径:" file_path
# 输入要替换的单词
read -p "请输入要替换的单词:" old_word
# 输入替换后的单词
read -p "请输入替换后的单词:" new_word
# 使用 sed 命令替换单词
sed -i "s/$old_word/$new_word/g" $file_path
echo "已将文件 $file_path 中的 $old_word 替换为 $new_word"

解释:先获取文本文件路径、要替换的单词和替换后的单词。然后使用 sed 命令的 s 选项进行替换,-i 表示直接在原文件上修改,g 表示全局替换,将文件中的特定单词替换后输出完成信息。

脚本二十六:打印当前目录下所有文件的权限信息

#!/bin/bash
# 使用 ls -l 命令输出文件权限信息
ls -l | awk '{print $1, $NF}'

解释:直接使用 ls -l 命令列出当前目录下文件的详细信息,然后通过 awk 提取权限信息(第一列)和文件名(最后一列)并输出。

脚本二十七:统计指定文本文件中单词的出现频率

#!/bin/bash
# 输入要统计的文本文件路径
read -p "请输入文本文件路径:" file_path
# 使用 awk 统计单词频率
awk '{for(i = 1; i <= NF; i++) count[$i]++} END {for(word in count) print word, count[word]}' $file_path

解释:先读取文本文件路径,然后在 awk 中,对于文件中的每一行,通过循环将每个单词作为数组 count 的索引,并递增其对应的值。在 END 块中,遍历 count 数组并打印出每个单词及其出现的频率。

脚本二十八:创建一个密码文件,并将用户输入的密码加密后写入

#!/bin/bash
# 输入密码
read -sp "请输入密码:" password
# 使用 openssl 加密密码并写入文件
echo $password | openssl enc -aes-256-cbc -a -salt -out password.enc
echo "密码已加密写入 password.enc 文件"

解释:先使用 read -sp 让用户输入密码,-sp 表示不显示输入内容。然后使用 openssl 命令将密码加密,-aes-256-cbc 是加密算法,-a 表示将输出转换为 base64 编码,-salt 表示使用盐值增加安全性,-out 表示输出文件名,最后输出加密完成信息。

脚本二十九:查找指定目录下所有符号链接文件并输出其指向的目标路径

#!/bin/bash
# 输入要查找的目录路径
read -p "请输入目录路径:" dir_path
# 使用 find 命令查找符号链接并输出目标路径
find $dir_path -type l -exec readlink -f {} \;

解释:先获取目录路径,然后使用 find 命令在该目录下查找类型为符号链接(-type l)的文件,再使用 readlink -f 命令获取符号链接指向的目标路径并输出。

脚本三十:根据用户输入的行数和列数创建一个简单的文本矩阵

#!/bin/bash
# 输入矩阵的行数
read -p "请输入矩阵的行数:" rows
# 输入矩阵的列数
read -p "请输入矩阵的列数:" cols
# 循环创建矩阵
for ((i = 1; i <= rows; i++)); do
    for ((j = 1; j <= cols; j++)); do
        echo -n "$((i * j)) "
    done
    echo
done

解释:先让用户输入矩阵的行数和列数。然后使用两层 for 循环,外层循环控制行数,内层循环控制列数,在循环中计算并输出矩阵元素(这里简单地使用行号和列号的乘积作为元素值),每输出完一行后换行。

脚本三十一:创建一个临时文件并写入当前时间,使用完毕后自动删除

#!/bin/bash
# 创建临时文件并写入当前时间
tmp_file=$(mktemp)
date +%Y%m%d%H%M%S > $tmp_file
# 这里可以添加使用临时文件的代码,例如读取其中的时间信息进行其他操作
# 使用完毕后删除临时文件
rm -f $tmp_file
echo "临时文件已创建、使用并删除"

解释:首先使用 mktemp 命令创建一个临时文件,其文件名存储在 tmp_file 变量中。然后将当前时间写入该临时文件。在实际应用中,可以在中间添加对临时文件内容(即时间信息)进行处理的代码。最后使用 rm -f 命令强制删除临时文件,即使文件不存在或无法删除也不会报错,并输出相关信息。

脚本三十二:根据进程名查找并杀死相关进程

#!/bin/bash
# 输入要杀死的进程名
read -p "请输入进程名:" process_name
# 使用 pgrep 查找进程 ID,然后使用 kill 命令杀死进程
pids=$(pgrep $process_name)
for pid in $pids; do
    kill -9 $pid
done
echo "已杀死进程名 $process_name 相关的进程"

解释:先让用户输入要杀死的进程名,然后使用 pgrep 命令查找与该进程名匹配的所有进程 ID,并将这些 ID 存储在 pids 变量中。接着通过循环遍历每个进程 ID,使用 kill -9 命令强制杀死进程,最后输出杀死进程的信息。

脚本三十三:比较两个目录下的文件是否一致(仅比较文件名和大小)

#!/bin/bash
# 输入第一个目录路径
read -p "请输入第一个目录路径:" dir1
# 输入第二个目录路径
read -p "请输入第二个目录路径:" dir2
# 比较两个目录下的文件信息
diff <(find $dir1 -type f -printf "%p %s\n") <(find $dir2 -type f -printf "%p %s\n")

解释:先获取两个目录路径,然后使用 find 命令分别在两个目录下查找所有文件,并使用 -printf 选项输出文件名和大小信息。通过 <() 语法将两个 find 命令的输出作为 diff 命令的输入,diff 命令会比较这两组文件信息,如果有差异则输出差异内容,如果一致则无输出。

脚本三十四:将一个大文件分割成固定行数的小文件

#!/bin/bash
# 输入要分割的大文件路径
read -p "请输入大文件路径:" large_file
# 输入每个小文件的行数
read -p "请输入每个小文件的行数:" lines_per_file
# 使用 split 命令按行数分割文件
split -l $lines_per_file $large_file split_file_
echo "大文件已按行数分割成小文件"

解释:先读取要分割的大文件路径和每个小文件的行数,然后使用 split 命令的 -l 选项按照指定行数分割大文件,分割后的小文件前缀为 split_file_,最后输出分割完成信息。

脚本三十五:提取文本文件中所有的邮箱地址

#!/bin/bash
# 输入要提取邮箱地址的文本文件路径
read -p "请输入文本文件路径:" file_path
# 使用 grep 命令提取邮箱地址
grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' $file_path

解释:先获取文本文件路径,然后使用 grep -Eo 命令,-E 表示使用扩展正则表达式,-o 表示只输出匹配的部分,通过正则表达式匹配并提取文本文件中的邮箱地址并输出。

脚本三十六:将文件中的制表符转换为空格

#!/bin/bash
# 输入要处理的文件路径
read -p "请输入文件路径:" file_path
# 使用 expand 命令转换制表符为空格
expand $file_path > new_$file_path
echo "已将文件 $file_path 中的制表符转换为空格,新文件为 new_$file_path"

解释:先读取文件路径,然后使用 expand 命令将文件中的制表符转换为空格,并将结果输出到一个新文件(文件名前加 new_),最后输出转换完成信息。

脚本三十七:创建一个包含特定内容的文本文件,内容为从 1 到 100 的数字列表

#!/bin/bash
# 定义文本文件名
file_name="number_list.txt"
# 循环生成数字列表并写入文件
for ((i = 1; i <= 100; i++)); do
    echo $i >> $file_name
done
echo "已创建包含 1 到 100 数字列表的文件 $file_name"

解释:先定义文本文件名,然后使用 for 循环从 1 到 100 依次将数字写入文件,最后输出文件创建成功信息。

脚本三十八:统计指定目录下文件的总行数

#!/bin/bash
# 输入要统计的目录路径
read -p "请输入目录路径:" dir_path
# 使用 find 和 wc 命令统计文件总行数
total_lines=$(find $dir_path -type f -exec wc -l {} \; | awk '{sum += $1} END {print sum}')
echo "目录 $dir_path 下文件的总行数为:$total_lines"

解释:先获取目录路径,然后使用 find 命令在目录下查找所有文件,并使用 wc -l 命令统计每个文件的行数,通过管道将结果传给 awk,在 awk 中累加所有文件的行数并输出总行数。

脚本三十九:将多个图片文件转换为指定格式(例如将 JPEG 转换为 PNG)

#!/bin/bash
# 输入要转换图片所在的目录路径
read -p "请输入图片目录路径:" img_dir
# 输入要转换的源图片格式
read -p "请输入源图片格式(例如 jpeg):" src_format
# 输入要转换到的目标图片格式
read -p "请输入目标图片格式(例如 png):" dst_format
# 使用 mogrify 命令转换图片格式(需要安装 ImageMagick)
mogrify -format $dst_format $img_dir/*.$src_format
echo "已将 $img_dir 下的 $src_format 图片转换为 $dst_format 格式"

解释:先获取图片目录路径、源图片格式和目标图片格式,然后使用 mogrify 命令(前提是安装了 ImageMagick 软件包)将目录下指定源格式的图片转换为目标格式,最后输出转换完成信息。

脚本四十:计算文本文件中每行的单词数并输出

#!/bin/bash
# 输入要处理的文本文件路径
read -p "请输入文本文件路径:" file_path
# 使用 awk 计算每行单词数并输出
awk '{print NF}' $file_path

解释:先读取文本文件路径,然后使用 awk 命令,NFawk 中的变量,表示当前行的单词数,通过循环处理文本文件的每一行并输出每行的单词数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值