process_files() {
for file in "$@"; do
if [ -f "$file" ]; then
case ${file##*.} in
txt)
line_count=$(wc -l < "$file")
echo "File $file has $line_count lines."
;;
sh)
if [ ! -x "$file" ]; then
chmod +x "$file"
echo "Added executable permission to $file."
else
echo "File $file already has executable permission."
fi
;;
*)
echo "Unsupported file extension for $file."
;;
esac
else
echo "File $file does not exist or is not a regular file."
fi
done
}
代码逻辑解释
- 循环遍历参数:使用
for file in "$@"
遍历函数传入的所有文件路径参数。"$@"
会扩展为函数调用时传入的所有参数,确保每个参数都被正确处理。
- 检查文件是否存在且为普通文件:
if [ -f "$file" ]
用于判断 $file
是否存在且是普通文件。-f
是Bash的文件测试操作符,用于检查文件是否为普通文件。
- 根据文件扩展名分类处理:
- 使用
${file##*.}
提取文件的扩展名。##
是Bash的字符串操作符,用于从变量值的末尾删除最长匹配模式。
- 使用
case
语句根据扩展名进行分类:
- .txt文件:使用
wc -l < "$file"
统计文件行数。wc -l
是用于统计行数的命令,< "$file"
是输入重定向,将文件内容作为 wc -l
的输入。
- .sh文件:使用
if [ ! -x "$file" ]
检查文件是否有可执行权限,-x
是文件测试操作符,用于检查文件是否可执行。如果没有可执行权限,则使用 chmod +x "$file"
添加权限。
- 其他扩展名:输出提示信息表示不支持该扩展名。
- 错误处理:如果文件不存在或不是普通文件,通过
echo
输出相应的错误信息,然后继续处理下一个文件,确保即使部分文件处理出错,其他文件仍能继续处理。
关键Bash特性
- 文件测试操作符:如
-f
(检查普通文件)和 -x
(检查可执行权限),这些操作符在文件处理和权限检查中非常有用。
- 字符串操作:
${file##*.}
用于提取文件扩展名,展示了Bash强大的字符串处理能力。
case
语句:用于根据不同条件执行不同的代码块,提高代码的可读性和可维护性。
- 输入重定向:
< "$file"
将文件内容作为命令的输入,这里用于统计文件行数。
- 循环结构:
for
循环用于遍历多个文件路径参数,是处理多个相似任务的常用结构。