这里是上下文:我正在生成一个小的Linux命令,以便在创建C程序时自动创建基本代码。
我的命令名是ctouch
:它类似于touch
命令,但是在创建文件之后,它还创建了C程序的基本结构:
#include <stdio.h>
#include <stdlib.h>
int main(){
return 0:
}
加上这些行就行了。这是我的代码:
#! /bin/bash
for arg in "$@"
do
[ ${arg: -2} == ".c" ] && touch "$arg" || touch "$arg.c"
echo '#include <stdio.h>' > "$arg"
echo '#include <stdlib.h>' >> "$arg"
echo $'\nint main90{\n\n\t' >> "$arg"
echo $'\n\treturn 0;\n\n}' >> "$arg"
done
如您所见,它可以创建与
touch
可以接受参数一样多的文件。条件循环(在do
之后的行)在我忘记指定.c
扩展名的情况下很有用:但问题是if
和else
都是在参数不以.c
结尾时执行的,但如果我不“忘记”指定它是一个C文件则可以。我该怎么解决?
最佳答案
这不是两手都拿。它根据扩展名执行touch
操作,但是如果您传入的是echo
序列,则它会将其输出放在不带扩展名的文件中。
我将重构为使用case
,使用here document打印多行,并完全跳过touch
;但最简单的修复方法是,如果输出文件缺少扩展名,则只需更改其名称。
for arg in "$@"
do
case $arg in
*.c) ;;
*) arg="$arg.c";;
esac
cat <<'____HERE' > "$arg"
#include <stdio.h>
#include <stdlib.h>
int main(){
return 0;
}
____HERE
done
通过这些更改,代码也应该可以移植到POSIX
/bin/sh
。关于bash - Bash同时输入if和else语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55244594/