Bash同时输入if和else语句

时间:2019-03-19 15:29:54

标签: bash

这里是上下文:我正在创建一个小的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文件时,没关系。

我该如何解决?

4 个答案:

答案 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