这里是上下文:我正在创建一个小的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文件时,没关系。
我该如何解决?
答案 0 :(得分:4)
它没有两个分支。它会根据扩展名执行cmd.exe
,但是如果您传入的是start
序列,则会将其输出放置在不带扩展名的文件中。
我将重构为使用touch
,使用here document打印多行,然后完全跳过echo
;但是最小的解决方法是仅更改缺少扩展名的输出文件名。
case
进行了这些更改之后,该代码也应该可以移植到POSIX touch
。
答案 1 :(得分:1)
一些改动:
#! /bin/bash
for arg in "$@"
do
[[ ${arg: -2} == ".c" ]] && FILE="$arg" || FILE="$arg.c"
echo '#include <stdio.h>' > "$FILE"
echo '#include <stdlib.h>' >> "$FILE"
echo $'\nint main90{\n\n\t' >> "$FILE"
echo $'\n\treturn 0;\n\n}' >> "$FILE"
done
答案 2 :(得分:1)
简化的解决方案避免了有条件的需要。无论原始参数是否以.c
结尾,您都想创建一个.c
文件,并有效地添加该文件(如果尚未存在)。这与始终将其添加到尝试以将其删除的结果相同。您也不需要使用touch
显式创建文件;输出重定向将在必要时创建文件。
这也演示了将模板内容写入文件的另一种方法。
for arg in "$@"
do
{
printf '#include <stdio.h>\n'
printf '#include <stdlib.h>\n'
printf '\nint main90 {\n'
printf '\n\treturn 0;\n\n}\n' # end with a newline
} > "${arg%.c}.c"
done
请注意,您的文件应该是正确的POSIX文本文件,以换行符结尾。
答案 3 :(得分:0)
此处文档的替代:
for arg in "$@"; do
if [ "${arg: -2}" == ".c" ]; then
filename="$arg"
else
filename="${arg}.c"
fi
cat<<EOT >"$filename"
#include <stdio.h>
#include <stdlib.h>
int main() {
return 0;
}
EOT
done