从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*//

我正在尝试从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*//' ) 
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