shelliterationzsh

Shell script - iterate over space separated words/characters (in zsh)


I am having some trouble figuring out how to iterate over space separated words/characters in a shell script. For instance I would like to iterate over a variable containing the characters in the alphabet separated by a space.

NOTE: The result should be the same even if the alphabet variable contained space separated strings instead of characters, i.e "aa bb cc ..." instead of "a b c .."

I have tried a lot of the alternatives provided from: How to split a line into words separated by one or more spaces in bash?

Example:

  local alphabet="a b c d e f g h i j k l m n o p q r s t u v w x y z"
  local index="0"
  for character in $alphabet; do
      index=$((++index))                                      
      echo "$index. $character"
      # Possibility to do some more stuff
  done 

Expected/Desired output:

1. a
2. b
3. c
and so on..

Result:

1. a b c d e f g h i j k l m n o p q r s t u v w x y z

Additional tests(without success):

  ####################################################################
  local alphabet="a b c d e f g h i j k l m n o p q r s t u v w x y z"
  local index="0"
  for character in ${alphabet[@]}; do
      index=$((++index))                                      
      echo "$index. $character"
      # Possibility to do some more stuff
  done 

  ####################################################################
  local alphabet="a b c d e f g h i j k l m n o p q r s t u v w x y z"                                            
  local alphabetArray=( ${alphabet} )                                                                             
  local index="0"                                                                                                 
  for character in "${alphabetArray[@]}"; do                                                                      
      index=$((++index))                                                                                          
      echo "$index. $character"                                                                                   
      # Possibility to do some more stuff                                                                                        
  done 

  ####################################################################
  local alphabet="a b c d e f g h i j k l m n o p q r s t u v w x y z"                                            
  local alphabetArray=( ${alphabet} )                                                                             
  local index="0"                                                                                                 
  for character in ${alphabetArray}; do                                                                           
      index=$((++index))                                                                                          
      echo "$index. $character"                                                                                   
      # Possibility to do some more stuff                                                                                        
  done

Could someone provide a solution on how to solve this(I would prefer a solution that iterates the alphabet variable without explicitly using an index variable, i.e $alphabet[index] )?


Solution

  • Thanks for your help. I discovered the error thanks to your feedback.

    I thought that it was irrelevant when I posted this question but I was experimenting with functions in my .zshrc file. Hence I was using (just my assumption) the zsh interpreter and not the sh or bash interpreter.

    By realizing that this could be a potential problem, I googled and found the following How to iterate through string one word at a time in zsh

    So I tested the following and it works as expected:

      setopt shwordsplit                                                                                              
      local alphabet="a b c d e f g h i j k l m n o p q r s t u v w x y z"                                            
      local index="0"                                                                                                 
      for character in $alphabet; do                                                                                  
          index=$(($index+1))                                                                                         
          echo "$index. $character"                                                                                   
          # Possibility to do some more stuff                                                                                        
      done                                                                                                            
      unsetopt shwordsplit
    

    NOTE:

    index=$((++$index))
    and/or
    index=$(($index++))
    

    Doesn't seem to work as I expected in zsh.

    ... The little gritty details, I should have used:

    ((++index)) 
    or
    ((index++))
    instead of
    index=$((++$index))