我有两个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解决方案。 (我可以编写一个函数来在几行代码中实现这一点,没有任何问题,所以这不是重点)。
答案 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}"
}
但是,我现在不会接受我的回答,希望能得到与我原来问题不同的答案。