34

I have a directory myDir of many .html files. I am trying to create an array of all the files in the directory so I might be able to index the array and be able to refer to particular html files in the directory. I have tried the following line:

myFileNames=$(ls ~/myDir)

for file in $myFileNames; 
#do something

but I want to be able to have a counter variable and have logic like the following:

 while $counter>=0;
   #do something to myFileNames[counter]

I am quite new to shell scripting and am unable to figure out how to achieve this hence would appreciate any help regarding this matter.

anonuser0428
  • 11,789
  • 22
  • 63
  • 86

3 Answers3

60

You can do:

# use nullglob in case there are no matching files
shopt -s nullglob

# create an array with all the filer/dir inside ~/myDir
arr=(~/myDir/*)

# iterate through array using a counter
for ((i=0; i<${#arr[@]}; i++)); do
    #do something to each element of array
    echo "${arr[$i]}"
done

You can also do this for iteration of array:

for f in "${arr[@]}"; do
   echo "$f"
done
anubhava
  • 761,203
  • 64
  • 569
  • 643
8

Your solution will work for generating the array. Instead of using a while loop, use a for loop:

#!/bin/bash
files=($( ls * )) #Add () to convert output to array
counter=0
for i in $files ; do
  echo Next: $i
  let counter=$counter+1
  echo $counter
done
Community
  • 1
  • 1
Paul Hicks
  • 13,289
  • 5
  • 51
  • 78
1
# create an array with all the filer/dir inside ~/myDir
arr=(~/myDir/*)

# iterate through array indexes to get 'counter'
for counter in ${!arr[*]}; do
    echo $counter           # show index
    echo "${arr[counter]}"  # show value
done
Ivan
  • 6,188
  • 1
  • 16
  • 23