我有这个:
date +"%H hours and %M minutes"
我用节日来表达它..但它说的是:“零九小时”..我希望它说“九小时”!
但日期总是给我 09...所以我想知道 bash 是否可以轻松地使它变成 9?
在我尝试过的复杂脚本中
printf %d 09
但它失败了..不是八进制:(
任何想法?
答案1
在您的情况下,您可以简单地通过在日期格式字符串
-
之后附加来禁用零填充:%
%-H
默认情况下,日期用零填充数字字段。 '%' 后面可以有以下可选标志:
-
(连字符)不要填充该字段_
(下划线)用空格填充0
(零)用零填充^
如果可能的话使用大写#
如果可能的话使用相反的情况
看日期手册
如果你想在 bash 中解释不同基数的数字
- 以 0 开头的常量被解释为八进制数。
- 前导 0x 或 0X 表示十六进制。
- 否则,数字采用 [base#]n 形式,其中 base 是 2 到 64 之间的十进制数,表示算术基数,n 是该基数中的数字
因此,要将数字解释为十进制,请使用
10#n
形式,例如。10#09
echo $((10#09*2)) 18
看算术评估bash 手册的一部分。
答案2
如果您尝试以十进制形式与日期值进行比较,我发现此方法非常有效:
let mymin=$(date '+1%M') ; let mymin=$mymin%100
这总是产生一个十进制值。所以我可以这样做:
if [[ $mymin -le 1 ]]; then # only 0 and 1 are true.
这样08、09就没有问题了。使用 %10 而不是 %100 给出从 0 到 9 的十分钟范围。我还发现以下给出了十进制值,没有前导零:
echo "$((10#$(date +%M)))"
答案3
0
可移植的是,您可以轻松地从变量中删除前导。如果没有前导 ,这将使变量保持不变0
。
eval $(date +"h=%H m=%M")
h=${h#0}
m=${m#0}
say "$h hours and $m minutes"
在 bash、ksh 或 zsh 中,您可以使用 ksh 的附加 glob 模式来删除任意数量的前导0
s。在 bash 中,shopt -s extglob
首先运行。在 zsh 中,setopt kshglob
首先运行。
eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"
答案4
一般来说,在 bash 中:
test ${#number} -eq 2 && number=${number#0}
导致
date +"%H %M" |
{ read hours minutes
hours=${hours#0}
minutes=${minutes#0}
echo "${hours} hours and ${minutes} minutes"; }
或者,不同的:
date +"%H hours and %M minutes" | sed -n -e 's/0\([0-9]\)/\1/g' -e p
我很惊讶日期没有适当的格式选项。