bash脚本中用变量调用tar命令解压tgz文件失败如何解决?
问题根因
你的脚本存在两处核心语法错误,导致tar命令实际未读取到正确的文件名参数:
- Shell变量赋值时
=两侧不允许有空格,你写的pini= $(find ...)会被Shell解析为「临时将pini变量设为空值,执行后面的find命令」,find的结果直接输出到终端,并未赋值给pini变量。你报错中打印的文件名其实是find命令的直接输出,而非echo $pini的输出,此时pini变量实际为空。 - Shebang行末尾多了多余的
.字符,会导致Shell解析器识别异常。 - (可选优化)变量调用时未加双引号,若文件名包含空格等特殊字符会导致参数解析错误。
解决方法
按照以下规则修改脚本即可:
- 修正Shebang行,删除末尾的多余
. - 移除变量赋值时
=两侧的空格 - 调用
$pini变量时包裹双引号,避免特殊字符影响
修正后的完整脚本
#!/bin/sh pini=$(find . -name 'pini-chart-2*' -printf '%f\n') echo "$pini" tar -xvf "$pini"
额外优化建议
如果存在匹配到多个tgz文件的场景,可以加判断逻辑避免报错:
#!/bin/sh pini=$(find . -name 'pini-chart-2*' -printf '%f\n') if [ $(echo "$pini" | wc -l) -ne 1 ]; then echo "匹配到的文件数量异常,请检查" exit 1 fi echo "$pini" tar -xvf "$pini"
内容的提问来源于stack exchange,提问作者dhandai
相关产品推荐
相关产品推荐

