从BASH数组变量中删除前导零

时间:2013-06-05 12:37:51

标签: 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*//' ) 
done

但失败了(抱歉,我是一位负责编写BASH脚本的老Java程序员)

4 个答案:

答案 0 :(得分:12)

使用参数扩展:

DATES=( ${DATES[@]#0} )

答案 1 :(得分:4)

使用bash算法,您可以通过指定数字是base-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

答案 2 :(得分:1)

您可以使用bash参数扩展(请参阅http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html),如下所示:

echo ${DATESLZ[@]#0}

答案 3 :(得分:0)

如果:${onedate%%[!0]*}将选择字符串$onedate前面的所有0。

我们可以通过这样做来删除那些零(它是可移植的):

echo "${onedate#"${onedate%%[!0]*}"}"

对于你的情况(只有bash):

#!/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