我制作了以下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
答案 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
您可能希望脚本在最后打印生成的目录的名称,和/或更改它以生成文件而不是目录。