Bash输入if和else语句

问题描述 投票:2回答:4

以下是上下文:我正在为我创建一个小的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文件。

我该如何解决这个问题?

bash
4个回答
4
投票

它不是两个分支。它根据扩展名执行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


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

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文本文件,以换行符结尾。


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
© www.soinside.com 2019 - 2024. All rights reserved.