Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to use global arrays in bash?
    text
    copied!<p>I was searching through SO and google for a solution to my problem for 2 days but I had no luck. My problem is that I have an array and I initiate its elements with 0's, and I modify its elements' values inside for\while loop scope. But when I print the array's values outside the loop, I find it all 0's as their initial values!!</p> <p>Here is my code:</p> <pre><code>#!/bin/bash # # This is a script to reformat CSV files into pretty-formatted txt files. clear echo 'This is a script to reformat CSV files into pretty-formatted txt files.' echo # Get number of elements. elements=$(cat CSV_File | sed -n 1'p' | tr ',' '\n' | wc -l) # "cat CSV_File" for getting text of the file. # "sed -n 1'p'" for getting only first line. # "tr ',' '\n'" for replacing ',' with '\n'. # "wc -l" for getting number of lines (i.e number of elements). # Get number of lines. lines=$(cat CSV_File | wc -l) # "cat CSV_File" for getting text of the file. # "wc -l" for getting number of lines. # Initiate an array for elements' lengths. for ((i=1; $i &lt; (( $elements + 1 )) ;i++)) do lengths[$i]="0" done # Find tallest element of each column and put the values into 'lengths' array. for ((i=1; $i &lt;= $lines ;i++)) do j="1" cat CSV_File | sed -n ${i}'p' | tr ',' '\n' | while read element do if [ ${lengths[$j]} -le ${#element} ] then lengths[$j]=${#element} fi (( j++ )) done done echo ${lengths[1]} # It should print 5 not 0 echo ${lengths[2]} # It should print 4 not 0 echo ${lengths[3]} # It should print 19 not 0 echo ${lengths[4]} # It should print 11 not 0 echo ${lengths[5]} # It should print 2 not 0 echo ${lengths[6]} # It should print 5 not 0 echo ${lengths[7]} # It should print 14 not 0 echo ... </code></pre> <p>and here is CSV_File contents:</p> <pre><code>Jones,Bill,235 S. Williams St.,Denver,CO,80221,(303) 244-7989 Smith,Tom,404 Polk Ave.,Los Angeles,CA,90003,(213) 879-5612 </code></pre> <p>Note that when I put <code>echo</code> inside the if statement, it prints the correct value:</p> <pre><code>if [ ${lengths[$j]} -le ${#element} ] then lengths[$j]=${#element} echo ${lengths[$j]} fi </code></pre> <p>What is wrong I'm doing? Am I missing something?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload