我从我的脚本中提取了以下简单的摘录,该摘录对于特定的输入来说很奇怪。
echo -e "Enter the Day of the Month : \c "
read input_day
printf -v input_day '%02d' "$input_day"
这可以确保如果用户输入单个数字(例如 2),那么它会将其转换为 02。这是我的第一个要求。如果输入 2 位数字如 02,这也有效。然后它会将其保留为 02。这也适用于 2 位数字如 12。但奇怪的是,它无法接受数字 08 和 09?这是当输入08或09时给出的错误。
Enter the Day of the Month : 08
2: line 20: printf: 08: invalid number
为什么会这样呢?我尝试阅读 printf 帮助页面,它显示“d”代表有符号十进制整数。所以它应该接受数字 8 和 9。或者我错过了什么?我的要求是用户应该能够输入月份中的某一天作为单位数“8”以及两位数“08”。
答案1
bash
会将带有前导零的数字解释为八进制。格式不是问题,$input_day
变量才是问题。
您可以使用多种方法删除它们(例如参见awk 相当于 C 中的 LTRIM 函数)。
进一步阅读:
在将变量传递给 iptables 之前删除前导零
使用此语法:$((10#$machinenumber))
,例如,对于您的示例:printf -v input_day '%02d' "$((10#$input_day))"
Bash:从变量中删除前导零
更重要的是:shopt -s extglob printf -v input_day '%02d' ${input_day##+(0)}
顺便说一句,该示例不检查变量是否为空。但正确验证这一点将是另一个问题。