0

Sorry for a bad title, please feel free to adjust it to something more appropriate.

How can I index arrays using zsh or bash scripting as I am doing for lists in R below;

# Some lists with the same number of elements
list1 <- list(sample(letters,10))
list2 <- list(1:10)

for(i in 1:length(list1)) {
  a <- list1[[1]][i]
  b <- list2[[1]][i]
}

print(paste(a,b))  # Or some other function where a and b are used simultaneously

[1] "f 1"
[1] "e 2"
[1] "t 3"
[1] "s 4"
[1] "c 5"
[1] "o 6"
[1] "p 7"
[1] "y 8"
[1] "k 9"
[1] "d 10"

The below code obviously only prints the last elements from both lists, since I have not found a way to do 1 to the length of array

# dummy data

echo 'A 1' > A.txt
echo 'B 1' > B.txt
echo 'C 1' > C.txt

echo 'A,2' > A.csv
echo 'B,2' > B.csv
echo 'C,2' > C.csv

txtlist=(*.txt) # create an array of .txt files
csvlist=(*.csv) # create an array of .csv files

# in zsh $#array returns the length of the array, so 

for i in $#txtlist; do
    a=$txtlist[i]
    b=$csvlist[i]

    echo $a,$b  # Or some other function where a and b are used simultaneously

done

#C.txt,C.csv

Any pointers would be very much appreciated, thanks!

3 Answers 3

4

bash and zsh both know C-style for-loops:

From man 1 zshmisc (man 1 bash is essentially the same):

for (( [expr1] ; [expr2] ; [expr3] )) do list done
       The  arithmetic expression expr1 is evaluated first (see the section `Arithmetic Evaluation').  The arithmetic expression expr2 is repeatedly
       evaluated until it evaluates to zero and when non-zero, list is executed and the arithmetic expression expr3 evaluated.  If any expression is
       omitted, then it behaves as if it evaluated to 1.

Example for zsh:

for (( i=1; i<=$#txtlist; i++ )); do
    echo "$txtlist[$i]" "$csvlist[$i]"
done

Example for bash:

for (( i=0; i<=${#txtlist[@]}; i++ )); do
    echo "${txtlist[$i]}" "${csvlist[$i]}"
done
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for the answer, its exactly what I needed. Would you care to elaborate on the zsh syntax a bit?
2

I am not sure to understand your example, I'm sorry, but, you can do loop like that in bash :

myLength=${#myArray[@]}
for (( i=1; i<${myLength}; i++ ));
do
  echo ${myArray[$i]}
done

Comments

1

Use the following syntax:

$ x=(1 2 3 4 5)
$ print $x
1 2 3 4 5
$ print ${x:1}
2 3 4 5

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.