这里是上下文:我正在生成一个小的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扩展名的情况下很有用:但问题是ifelse都是在参数不以.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/

10-16 18:10