如何创建新文件并自动选择其名称?

时间:2015-03-06 18:01:45

标签: linux bash shell

我制作了以下Bash脚本(我是初学者)。

它创建一个新目录programming,其中包含一个名为main.cpp的文件,然后在nano中打开它以便我们对其进行编辑。一旦我们保存它,它就会编译它,更改编译文件的名称并执行它。之后它会回到根目录。

我想要的是每次执行此脚本时,都会自动为该文件指定一个新名称,例如:如果第一次执行文件是main.cpp, 当再次执行时,它应该创建一个名为main_1.cpp的文件,然后是main_2.cpp,依此类推...

我可以使用for循环或if - else声明吗?

这是脚本:

mkdir programming
cd programming
nano main.cpp
g++ main.cpp
mv a.out main_executable
./main_executable
cd

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,但基本上只测试一个main_1.cpp是否存在,如果存在,则找到最后一个(最大)main_#并递增1,如果它不存在,那么只需移动到main_1.cpp。以下是具有基本逻辑的代码片段:

if [ -e main_1.cpp ]; then
    num=2
    while [ -e "main_${num}.cpp" ]; do
        num=$((num + 1))
    done
    mv main.cpp "main_${num}.cpp"
else
    mv main.cpp main_1.cpp
fi

答案 1 :(得分:0)

mktemp command可以稳健而安全地完成此任务。

请特别注意,它避免了您天真实现中的两个严重的安全漏洞 - 可预测的文件名和符号链接攻击。

#!/bin/sh
t=$(mktemp -d programmingXXXXXXX) || exit 127
trap 'rm -rf "$t"' HUP INT QUIT TERM  # Clean up if interrupted
cd "$t"
nano main.cpp
g++ main.cpp -o main_executable && ./main_executable
# cd  <- no point in that; the parent shell's cwd will not have been affected

您可能希望脚本在最后打印生成的目录的名称,和/或更改它以生成文件而不是目录。