使用ISF输入的Bash数组

时间:2018-04-17 01:52:57

标签: bash ifs

我有一个以1,3,5,7-10的方式给出的字符串......这需要放在一个1 3 5 7 8 9 10的数组中,所以任何地方都有一个减号然后我需要添加缺少的数字。我可以使用IFS将它拆分成一个数组,在任何地方都有一个逗号。问题是当我再次使用IFS分割两个数字(如7-10)时,它不会拆分它们。这是我的代码:

IFS=', ' read -r -a array <<< "$string"

for index in "${!array[@]}"
do
    if [[ ${array[index]} == *[-]* ]]; then
    IFS='- ' read -r array2 <<< "${array[index]}"
    #for Counter in $(eval echo "{${array2[0]}...${array2[1]}}")
    #do
        #echo "$Counter ${array2[Counter]}"
    echo "0 ${array2[0]}"
    echo "Yes"
    #done
    fi
done

for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done

第二个IFS的输出给了我7-10,这意味着它没有拆分它(你可以从代码中看到我有点麻烦。想法是拆分它并在for循环中使用它来追加我现有的数组需要的数字。)

如果你能指出我正确的方向,请告诉我为什么这不起作用,或者提出一个更好的想法。

2 个答案:

答案 0 :(得分:0)

以下是对您所需代码的轻微更新:

str="1, 2, 3, 5, 7-10, 11, 12, 15-20, 24"   

IFS=', ' read -r -a arr <<< "$str"

# Empty array, populated in the for-loops below
array=()          

for elem in ${arr[@]}; do
    if [[ $elem == *[-]* ]]; then
        IFS='-' read -r -a minMax <<< $elem
        for (( j = ${minMax[0]}; j <= ${minMax[1]}; j++ )); do
            array+=($j)
        done
    else
        array+=($elem)
    fi
done

echo ${array[@]}

将输出:

1 2 3 5 7 8 9 10 11 12 15 16 17 18 19 20 24

答案 1 :(得分:0)

不使用循环,

string="1,3, 5, 7-10"
string=$(echo "$string" | sed -e 's/\(\([0-9]\+\)-\([0-9]\+\)\)/{\2..\3}/g' | sed -e 's/,/ /g')
eval declare -a array=("$string")
echo ${array[*]}

产生

1 3 5 7 8 9 10