Linux脚本- 执行当前文件下前500个.c文件,并将每个文件对应的执行结果重定向到同名的.ok文件中

需求:执行当前文件下前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

这里是脚本做了什么:

  1. 初始化一个计数器 counter 为 0。
  2. 使用 for 循环遍历当前目录下的所有 .c 文件。
  3. 使用 gcc 编译每一个 .c 文件。
  4. 如果编译成功($? -eq 0 检查上一条命令的退出状态),执行编译出的程序并将输出重定向到 .ok 文件。
  5. 删除编译生成的可执行文件。
  6. 更新计数器。

要运行这个脚本,保存它到一个文件(比如 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 作为新的文件扩展名,从而生成输出文件的名称。

你可能感兴趣的:(Linux,linux)