Bash变量赋值异常求助:文件存在时变量未正确赋值
问题原因及解决方法
核心问题
你用(...)把部分命令包裹起来,这会创建一个子shell。在子shell里对DELETE变量的赋值,仅在子shell环境中有效,子shell执行结束后,父shell完全无法获取这个赋值结果,所以父shell里的DELETE变量始终为空,最终输出空内容。
解决方案
方案1:替换子括号为大括号
用{...}替代(...)来组合命令(注意大括号前后的空格,以及内部命令末尾的分号),这样所有命令都在当前shell执行,变量赋值能正常传递:
#!/usr/bin/env bash { [ -f first.txt ] && [ -f second.txt ] && rm first.txt && DELETE="File deleted"; } || DELETE="File not found"; echo "${DELETE}"
方案2:改用if条件结构(推荐)
直接用更直观的if逻辑组织代码,可读性更强,也从根源避免子shell问题:
#!/usr/bin/env bash DELETE="File not found" if [ -f first.txt ] && [ -f second.txt ]; then rm first.txt DELETE="File deleted" fi echo "${DELETE}"
内容的提问来源于stack exchange,提问作者iFunction
相关产品推荐
相关产品推荐

