Bash script array to csv

2020-04-11 00:14发布

问题:

I want to do comma separated string from my array. In my script i collecting data to array outputArr and then i want to echo it to check it out, but now i'm stuck. I want to print it on console using:

echo ${outputArr[*]}

But i'm getting wrong output. So i'm trying to debug it and write it like this:

echo ${outputArr[0]}
echo ${outputArr[1]}
echo ${outputArr[*]}
echo "-------------"

OK here is my output:

Terminally Yours
2204
 2204nally Yours
-------------

and other example:

Alfa
1491
 1491
-------------

Why this is overwritten with space in the beginning? Of course my goal is (finally):

Alfa;1491

In this point:

Alfa1491

EDIT:

while read -r line
do
    singleLine=$line
    if [[ $singleLine =~ $regexVenueName ]]
    then
        singleLine=${singleLine/<span id=\"ctl00_MainContent_lbPartner\" class=\"Partner\">/}
        singleLine=${singleLine/<\/span> <br \/><br \/>/}
        partnerVenueNameOutput+="$singleLine"
        outputArr[0]=$singleLine
    fi
done < "$f"

回答1:

Your array contains elements with carriage returns:

$ foo=($'\rterminally yours' $'\r2204')
$ echo "${foo[0]}"
terminally yours
$ echo "${foo[1]}"
2204
$ echo "${foo[*]}"
2204inally yours 

For your code, you can add the following to remove the carriage return from the variable:

singleLine=${singleLine//$'\r'/}


回答2:

To remove any trailing carriage returns from each array element, try

outputArray=( "${outputArray[@]%$'\r'}" )

However, it would probably be better to examine how outputArray is set in the first place and prevent the carriage returns from being added in the first place. If you are reading from a file that uses DOS line endings, try "cleaning" it first using dos2unix.