需求:执行当前文件下前500个.c文件,并将每个文件对应的执行结果重定向到同名的.ok文件中
以下是一个用于实现该功能的 Bash 脚本。
#!/bin/bash
# 计数器,用于限制处理的文件数量
counter=0
# 遍历当前目录下的所有 .c 文件
for c_file in *.c; do
# 如果已经处理了500个文件,就跳出循环
if [ $counter -ge 500 ]; then
break
fi
# 编译 .c 文件
gcc "$c_file" -o "${c_file%.c}.out" 2>/dev/null
# 如果编译成功,则执行程序,并将结果保存到 .ok 文件中
if [ $? -eq 0 ]; then
"./${c_file%.c}.out" > "${c_file%.c}.ok" 2>&1
else
echo "Compilation failed for $c_file" > "${c_file%.c}.ok"
fi
# 删除编译生成的可执行文件
rm -f "${c_file%.c}.out"
# 更新计数器
counter=$((counter + 1))
done
这里是脚本做了什么:
- 初始化一个计数器
counter
为 0。
- 使用
for
循环遍历当前目录下的所有 .c
文件。
- 使用
gcc
编译每一个 .c
文件。
- 如果编译成功(
$? -eq 0
检查上一条命令的退出状态),执行编译出的程序并将输出重定向到 .ok
文件。
- 删除编译生成的可执行文件。
- 更新计数器。
要运行这个脚本,保存它到一个文件(比如 compile_and_run.sh
),然后给它执行权限:
chmod +x compile_and_run.sh
然后执行它:
./compile_and_run.sh
注: ${c_file%.c} 是一种参数扩展(parameter expansion)的语法,用于对变量 $c_file 进行字符串操作。
在这种语法中,% 是一个操作符,表示从变量的末尾开始匹配并删除指定的模式。具体来说,${c_file%.c} 表示删除变量 $c_file 末尾的 .c。
这种操作在字符串处理中很常见,用于去除文件名中的文件扩展名或者删除字符串中的特定后缀。
让我们来看一个例子:
filename="example.txt"
echo ${filename%.txt}
输出结果是:
example
因为 ${filename%.txt} 删除了变量 $filename 末尾的 .txt。
在上面的第一个脚本中,${c_file%.c} 的作用是将 .c 文件的文件名提取出来,而不包括文件扩展名。然后使用 .out 作为新的文件扩展名,从而生成输出文件的名称。