从BASH数组变量中删除前导零
我正在尝试从BASH数组中删除前导零。。。我有这样一个数组:从BASH数组变量中删除前导零,bash,sed,awk,Bash,Sed,Awk,我正在尝试从BASH数组中删除前导零。。。我有这样一个数组: echo "${DATES[@]}" 返回 01 02 02 03 04 07 08 09 10 11 13 14 15 16 17 18 20 21 22 23 我想从日期中删除前导零并存储回数组或另一个数组,这样我可以在另一个步骤中进行迭代。。。有什么建议吗 我试过这个 for i in "${!DATES[@]}" do DATESLZ["$i"]=(echo "{DATES["$i"]}"| sed 's/0*//
echo "${DATES[@]}"
返回
01 02 02 03 04 07 08 09 10 11 13 14 15 16 17 18 20 21 22 23
我想从日期中删除前导零并存储回数组或另一个数组,这样我可以在另一个步骤中进行迭代。。。有什么建议吗
我试过这个
for i in "${!DATES[@]}"
do
DATESLZ["$i"]=(echo "{DATES["$i"]}"| sed 's/0*//' )
done
但是失败了(对不起,我是一个老Java程序员,负责编写一些BASH脚本)使用参数扩展:
DATES=( ${DATES[@]#0} )
可以像这样使用bash参数展开(请参见):
echo ${DATESLZ[@]#0}
使用bash算术,您可以通过将数字指定为以10为基数来避免八进制错误:
day=08
((day++)) # bash: ((: 08: value too great for base (error token is "08")
((day = 10#$day + 1))
echo $day # 9
printf "%02d\n" $day # 09
如果:
${onedate%%[!0]*}
将选择字符串前面的所有0$onedate
我们可以通过这样做删除这些零(它是可移植的):
对于您的情况(仅限bash):
将打印:
$ script.sh
01 1
02 2
02 2
08 8
10 10
18 18
20 20
21 21
0008 8
00101 101
对于每一个项目,
printf“%d”DATES
如何?@fedorqui,这就是为什么:printf“%d”08
==>bash:printf:08:10#$day的无效八进制数
+1,但是如何将其应用于当前问题?问题是“删除前导零…以便我可以在另一个步骤中迭代”。首先没有必要删除零。我的意思是OP专门询问了一个数组。我知道,但有时我们不应该给人们确切的要求()可以用来删除任何数量的零。使用@l0b0建议时要小心。这将不仅删除填充的0,还将删除值“0”。我的脚本需要支持“0”。因此,在使用shopt
命令之前,我需要构建更多的逻辑来识别“0”是否存在,然后在所有整理完成后,在最后将“0”重新添加到我的数组中。
#!/bin/bash
dates=( 01 02 02 08 10 18 20 21 0008 00101 )
for onedate in "${dates[@]}"; do
echo -ne "${onedate}\t"
echo "${onedate#"${onedate%%[!0]*}"}"
done
$ script.sh
01 1
02 2
02 2
08 8
10 10
18 18
20 20
21 21
0008 8
00101 101