Bash脚本ctouch中条件分支同时执行问题的修复求助
修复你的
ctouch脚本问题 嘿,我明白你遇到的问题了!咱们先拆解一下问题出在哪,然后一步步修复:
问题根源分析
你脚本里的核心问题有两个:
- 条件判断的逻辑隐患:用
[ ${arg: -2} == ".c" ] && touch "$arg" || touch "$arg.c"这种写法看似是二选一,但其实存在短路求值的坑——如果touch "$arg"因权限等原因执行失败,shell会触发后面的touch "$arg.c",这违背了你“要么创建原文件名,要么加.c后缀”的初衷。 - 文件名不统一:你后面的写入操作始终用原参数
$arg,而非判断后确定的目标文件。比如输入test时,判断分支会创建test.c,但后续echo却写入test,导致意外生成两个文件,看起来像是两个分支都执行了。
修复方案
我们先统一确定目标文件名,再执行后续操作,用清晰的if-else代替容易踩坑的&& ||:
#!/bin/bash for arg in "$@" do # 先确定最终要创建的文件名 if [[ ${arg: -2} == ".c" ]]; then target_file="$arg" else target_file="$arg.c" fi # 统一操作这个目标文件 touch "$target_file" echo '#include <stdio.h>' > "$target_file" echo '#include <stdlib.h>' >> "$target_file" echo -e '\nint main(){\n\n\t' >> "$target_file" echo -e '\n\treturn 0;\n\n}' >> "$target_file" done
额外优化建议
- 用
[[ ]]代替[ ]:bash中的[[ ]]是更安全的条件判断,处理含空格的文件名、空变量时无需额外加引号,也不会触发通配符扩展。 - 用参数扩展简化文件名判断:可以一行代码搞定文件名处理,比
if-else更简洁:target_file="${arg%.c}.c"${arg%.c}会去掉参数末尾的.c(如果存在),再重新加上.c,确保最终文件名一定以.c结尾。结合这个写法,脚本可以更简洁:
这里的#!/bin/bash for arg in "$@" do target_file="${arg%.c}.c" touch "$target_file" # 用here-doc写入多行内容,更清晰易维护 cat > "$target_file" << 'EOF' #include <stdio.h> #include <stdlib.h> int main(){ return 0; } EOF donecat << 'EOF'可以直接写入多行原始内容,避免多次echo的繁琐,单引号包裹的EOF还能防止变量替换,确保模板代码完全按原样写入。
这样修改后,不管你输入带.c还是不带.c的参数,都会只生成一个正确的C文件,并自动填充模板代码啦!
内容的提问来源于stack exchange,提问作者qux
相关产品推荐
相关产品推荐

