Shell脚本中如何拼接字符串、变量并搭配通配符校验文件存在性
现有脚本问题定位
- 核心语法错误出在日期变量的赋值逻辑:你写的
yesterdaydate= date -d '-1 day' '+%Y%m%d'不符合Shell的变量赋值规则。Shell解析这行代码时,并不会将date命令的执行结果存入yesterdaydate变量,而是临时给yesterdaydate设为空值、单独执行后面的date命令把结果打印到终端,导致yesterdaydate实际是空字符串,后续拼接路径时自然不会带出日期内容。 - 你观察到echo输出了日期、但路径里没带上日期的现象,本质就是date命令是独立执行的,结果根本没存到变量里。
符合需求的实现步骤
1. 修正日期变量赋值
要把命令执行结果存入变量,需要用$()把整段命令包裹起来,正确写法为:yesterdaydate=$(date -d '-1 day' '+%Y%m%d')
执行后echo这个变量,就能正常拿到类似20240521格式的昨日日期值。
2. 拼接带通配符的目标匹配路径
按照你要求的「基础路径 + 昨日日期 + 动态时间通配符 + 固定文件后缀」结构,直接做字符串拼接即可,建议给变量加双引号包裹避免路径带空格时的解析问题:
# 基础路径前缀 base_path='/data/ftp/vendor/processed/ccs_' # 拼接生成完整匹配规则 target_pattern="${base_path}${yesterdaydate}_*_itemsku.xml"
最终生成的target_pattern会是形如/data/ftp/vendor/processed/ccs_20240521_*_itemsku.xml的格式,完全匹配你的预期结构。
- 注意:你实际运行时出现的
/data/ftp/corecentric/processed/ccs_路径偏差,是基础路径前缀本身填写错误导致的,和日期拼接逻辑无关,只要将base_path的字符串替换为你实际的文件存储目录即可修正。
3. 文件存在性校验实现
因为路径中带通配符,不能直接用-e参数判断单文件存在(未匹配到文件时,Shell会把*当字面量字符处理,导致判断逻辑失效),可以用遍历匹配的方式做校验:
file_exist=0 # 遍历通配符匹配到的所有文件 for single_file in $target_pattern; do # 排除未匹配时通配符作为字面量的误判 if [ -f "$single_file" ]; then file_exist=1 break fi done # 根据校验结果执行后续逻辑 if [ $file_exist -eq 1 ]; then echo "已找到符合命名规则的目标文件" else echo "未找到对应昨日日期的目标文件,请检查目录或文件命名" fi
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

