Linux Bash脚本运行时返回码为空,手动执行正常求排查
Bash脚本文件可读性检查异常:返回码为空问题解决
问题描述
编写的Bash脚本用于检查文件是否存在且可读,手动执行时功能正常,但通过脚本调用(如定时任务、其他脚本触发)时返回码为空。脚本中${PARAM_FILES_ARR[@]}数组包含类似/somedir/file1.prm的文件路径值。
核心问题排查
原脚本的数组赋值逻辑存在多个致命问题:
- 错误删除路径斜杠:
sed 's/\///g'会删除路径中的所有斜杠,导致/somedir/file1.prm被篡改为somedirfile1.prm,完全破坏文件路径结构。 - 数组赋值拆分逻辑错误:用
$(cat ...)直接赋值数组时,会将输出按空格、制表符、换行符拆分元素,若路径包含空格会导致数组元素错乱。 - sed命令冗余:多个独立sed进程会降低执行效率,且增加出错概率。
修复方案
- 移除破坏路径的
sed 's/\///g'命令,保留原始路径结构。 - 使用
mapfile -t按行读取文件到数组,避免空格拆分问题,同时自动去除每行末尾换行符。 - 合并多个sed表达式为单个进程,提升执行效率。
- 改用
[[ -r ]]直接检查文件可读性,替代cat > /dev/null,语义更明确且效率更高。
完整修复后的脚本
#!/bin/bash ...some code... # 读取参数文件列表,过滤无效行并处理后存入数组 mapfile -t PARAM_FILES_ARR < <(sed -e '/^[[:blank:]]*$/d' \ -e '/^#/d' \ -e '/^[$]{2}/d' \ -e 's/^[[:blank:]]*//' \ -e 's/[[:blank:]]*$//' \ "$PARAM_FILES_LIST" | envsubst) for FNAME in "${PARAM_FILES_ARR[@]}" do # 检查文件是否可读 if [[ ! -r "$FNAME" ]]; then RETURN_CODE_FILE=$? echo "Warning! Could not Read PARAM FILE ${FNAME}" echo "${RETURN_CODE_FILE}" fi done
修复点说明
mapfile -t:进程替换结合mapfile实现按行读取,确保每个路径作为独立数组元素,支持含空格的路径。- 合并sed表达式:通过
-e参数串联所有过滤、替换规则,减少进程创建开销。 [[ ! -r "$FNAME" ]]:直接判断文件是否存在且当前用户有读取权限,返回码0表示可读,非0表示不可读,逻辑更直观。
内容的提问来源于stack exchange,提问作者Srinivasarao Kotipatruni
相关产品推荐
相关产品推荐

