You need to enable JavaScript to run this app. Shell脚本中如何拼接字符串、变量并搭配通配符校验文件存在性
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 04:36:04