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解析报错。
正确实现方式
要在脚本中捕获命令输出并赋值给变量,需要用命令替换语法,有两种常用写法:
- 反引号写法(你已发现的方式):
#!/bin/bash dat=`date +%Y%m%d%H%M` echo "dat=" ${dat}
- $()写法(更推荐,可读性更强,支持嵌套命令):
#!/bin/bash dat=$(date +%Y%m%d%H%M) echo "dat=" ${dat}
关于${...}类语法的说明
不存在直接用${}执行命令并赋值的写法,因为${}和$()的定位完全不同:
$():命令替换,执行括号内的命令,将命令的标准输出结果作为值返回,专门用于捕获命令输出。${}:变量扩展,仅用于处理已定义的变量,比如:${var}:等价于$var,取出变量var的值${var:-默认值}:如果var未定义或为空,则使用指定的默认值${var%后缀}:删除变量值末尾的指定后缀
两者不能混用,执行外部命令必须用命令替换(反引号或$()),处理变量才用${}。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

