bash:组合两个数组的所有元素(并为每个数组添加内容)

时间:2017-07-28 04:30:08

标签: arrays string bash expansion

我有两个bash数组,想要组合两者的所有元素,并为每个结果元素添加一个字符串。

具体来说,我有一个包含几年的数组和一些有几个月的数组,并希望每年的每个月第一天的日期字符串:

# Define arrays containing some years and months (zero-padded)
yyyys=(2000 2001 2002)
mms=(12 01 02)

# I want to achieve the following using the arrays defined above
echo {2000..2002}{12,01,02}01 # 20001201 20000101 20000201 20011201 ...

# For hard-coded months, the following does what I want
echo ${yyyys[@]/%/0101} # 20000101 20010101 20020101

# How can i achieve this for arbitrary months, using $mms?

如何用尽可能少的代码实现这一目标?

注意:我需要这个(足够脏)的bash运行脚本,所以我不是在寻找一个干净,便携的解决方案,而是使用字符串扩展,管道或其他任何必要的压缩bash解决方案。 (我可以编写一个函数来在几行代码中实现这一点,没有任何问题,所以这不是重点)。

1 个答案:

答案 0 :(得分:0)

我找到了一个基于大括号扩展的部分解决方案:

eval echo $(echo "{${yyyys[@]}}{${mms[@]}}01" | sed 's/ /,/g')
# 20001201 20000101 20000201 20011201 20010101 20010201 20021201 20020101 20020201

但是,这仅适用于两个数组都包含多个元素的情况,否则不会解析大括号。

鉴于单元素数组是一个非常真实的用例,我仍然编写了一个函数:

# Create timesteps from combinations of years, days, months, hours
# - $1 year(s), e.g., 2001, 2004-2006+2008
# - $2 month(s), e.g., 06, 12+01-02
# - $3 day(s), e.g., 01, 01-28
# - $4 hour(s), e.g., 00, 00+06+12+18
create_timesteps()
{
    local ys=($(expand_list_range ${1}))
    local ms=($(expand_list_range ${2}))
    local ds=($(expand_list_range ${3}))
    local hs=($(expand_list_range ${4}))

    local expr=""
    [ ${#ys[@]} -eq 1 ] && expr+="${ys}" || expr+="{${ys[@]}}"
    [ ${#ms[@]} -eq 1 ] && expr+="${ms}" || expr+="{${ms[@]}}"
    [ ${#ds[@]} -eq 1 ] && expr+="${ds}" || expr+="{${ds[@]}}"
    [ ${#hs[@]} -eq 1 ] && expr+="${hs}" || expr+="{${hs[@]}}"

    expr="$(echo "${expr}" | sed 's/ /,/g')"
    eval echo "${expr}"
}
但是,我现在不会接受我的回答,希望能得到与我原来问题不同的答案。