Shell脚本 - 迭代空格分隔的单词/字符(在zsh中)

时间:2017-09-05 13:44:24

标签: shell iteration zsh

我在查找如何在shell脚本中迭代空格分隔的单词/字符时遇到了一些麻烦。例如,我想迭代一个变量,该变量包含由空格分隔的字母表中的字符。

注意:即使字母变量包含空格分隔的字符串而不是字符,结果应该是相同的,即“aa bb cc ...”而不是“a b c ..”

我尝试了很多替代方案: How to split a line into words separated by one or more spaces in bash?

示例

  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 

预期/期望的输出

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

结果

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

其他测试(未成功)

  ####################################################################
  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

有人可以提供一个如何解决这个问题的解决方案(我更倾向于一个迭代字母变量但没有明确使用索引变量的解决方案,即$ alphabet [index])?

2 个答案:

答案 0 :(得分:2)

感谢您的帮助。由于您的反馈,我发现了错误。

我认为发布此问题时无关紧要,但我正在试验我的.zshrc文件中的函数。因此我使用(仅我的假设)zsh解释器而不是sh或bash解释器。

通过认识到这可能是一个潜在的问题,我用Google搜索并找到了以下How to iterate through string one word at a time in zsh

所以我测试了以下内容,它按预期工作:

  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

注意:

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

似乎没有按照我在zsh中的预期工作。

......我应该使用的小细节:

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

答案 1 :(得分:0)

试试这个

IFS=$' \t\n'
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

希望有所帮助