为什么我的bash脚本中date命令无法识别传入的年份变量?
问题根因
Bash 中函数的位置参数和脚本全局的位置参数完全独立,互不干扰:
- 函数内写的
$1,默认指向调用该函数时传入的第一个参数,而非执行脚本时传给脚本文件的第一个参数 - 你没有给
myFnc传参就直接调用的话,函数内的$1是空值,拼接后得到的日期字符串为-01-01,属于非法日期格式,因此触发date命令报错,报错信息中的#就是空值的显示占位。
解决方案
两种常用的修复方式:
方式1:调用函数时传入脚本参数
在脚本全局调用myFnc的位置,把脚本接收的年份参数传给函数即可,你写的函数内加引号的逻辑不需要改动:
# 脚本全局调用函数的位置,把脚本的$1传给函数 myFnc "$1" # 函数原有逻辑保持不变即可 function myFnc(){ ... variable1=$(date -d "$1-01-01" +%W) ... }
方式2:函数内使用全局变量存储的入参
如果不想修改函数调用逻辑,可以先把脚本接收的参数存入全局变量,函数内直接调用该全局变量即可,推荐用${变量名}的写法明确变量边界,避免拼接歧义:
# 脚本开头先把传入的年份存为全局变量 input_year="$1" function myFnc(){ ... variable1=$(date -d "${input_year}-01-01" +%W) ... }
内容的提问来源于stack exchange,提问作者Gpp094
相关产品推荐
相关产品推荐

