You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本中无法存储date命令输出到变量的问题及疑问

问题描述

在Bash Shell中直接执行以下命令可以获取格式化的日期时间:

$ date +%Y%m%d%H%M
202208161535

但将其写入Bash脚本后运行报错:

#!/bin/bash
dat=${date +%Y%m%d%H%M}
echo "dat=" ${dat}

运行结果:

$ test.bash
./test.bash: line 2: ${date +%Y%m%d%H%M}: bad substitution
dat=

补充说明:

  • 已发现使用dat=date +%Y%m%d%H%M``可以正常运行,但想了解如何通过类似dat=${date +%Y%m%d%H%M}的语法实现该功能。
  • 问题源于不清楚Bash中()和{}的区别,无法通过关键词搜索到解决方案。

解答

错误原因

${date +%Y%m%d%H%M}是变量扩展语法,它的作用是处理已定义的变量(比如设置默认值、替换内容等),而非执行外部命令。你误将命令执行逻辑套用到了变量扩展语法里,导致shell解析报错。

正确实现方式

要在脚本中捕获命令输出并赋值给变量,需要用命令替换语法,有两种常用写法:

  1. 反引号写法(你已发现的方式):
#!/bin/bash
dat=`date +%Y%m%d%H%M`
echo "dat=" ${dat}
  1. $()写法(更推荐,可读性更强,支持嵌套命令):
#!/bin/bash
dat=$(date +%Y%m%d%H%M)
echo "dat=" ${dat}

关于${...}类语法的说明

不存在直接用${}执行命令并赋值的写法,因为${}和$()的定位完全不同:

  • $():命令替换,执行括号内的命令,将命令的标准输出结果作为值返回,专门用于捕获命令输出。
  • ${}:变量扩展,仅用于处理已定义的变量,比如:
    • ${var}:等价于$var,取出变量var的值
    • ${var:-默认值}:如果var未定义或为空,则使用指定的默认值
    • ${var%后缀}:删除变量值末尾的指定后缀

两者不能混用,执行外部命令必须用命令替换(反引号或$()),处理变量才用${}。


内容的提问来源于stack exchange,提问作者Chan Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:24:28