如何在Bash的if条件中带参数调用外部脚本并解决命令找不到报错
问题解决方案
IsArchive: command not found报错的核心原因是Bash执行主脚本时,未在系统命令搜索路径(PATH)中找到对应可执行文件,同时你编写的IsArchive脚本本身也存在独立执行的语法兼容问题,具体解决方法可从以下两种方案中二选一:
方案1:作为独立外部脚本调用
- 修正IsArchive脚本的退出逻辑:
return语法仅可用于Shell函数或被导入(source)的脚本,独立执行的脚本需要用exit返回状态码,修正后代码如下:
#!/bin/bash STR="$1" if [[ "$STR" == *".zip"* ]] || [[ "$STR" == *".iso"* ]] || [[ "$STR" == *".tar.gxz"* ]] || [[ "$STR" == *".tar.gx"* ]] || [[ "$STR" == *".tar.bz2"* ]] || \ [[ "$STR" == *".tar.gz"* ]] || [[ "$STR" == *".tar.xz"* ]] || [[ "$STR" == *".tgz"* ]] || [[ "$STR" == *".tbz2"* ]] then exit 0 else exit 1 fi
- 给IsArchive添加可执行权限,执行命令:
chmod +x 你的IsArchive文件实际路径,若两个脚本放在同一目录,可直接执行chmod +x ./IsArchive - 主脚本调用时填写IsArchive的完整路径,同目录下修改示例如下:
elif [[ $Option = "2" ]] then if ./IsArchive "$SourcePath"; then less -1Ras "$SourcePath" | tee "$OutputFilePath" # 如果文件不是归档格式 else ls -1Rasl "$SourcePath" | tee "$OutputFilePath" fi
如果IsArchive存放在固定目录,也可以直接写绝对路径调用,例如if /opt/scripts/IsArchive "$SourcePath";
方案2:作为功能片段导入主脚本调用
如果不想每次调用都写全路径,可将IsArchive脚本内容导入主脚本的执行环境,此时原有return语法无需修改:
- 在主脚本开头、调用IsArchive之前的任意位置添加导入语句:
# 替换为IsArchive的实际路径 source ./IsArchive # 也可以写为. ./IsArchive,和source命令效果完全一致
- 无需修改原有调用逻辑,直接使用
if IsArchive "$SourcePath";即可正常运行
内容的提问来源于stack exchange,提问作者ma yoko
相关产品推荐
相关产品推荐

