【问题标题】:How to iterate the number of arguments in a for loop?如何迭代for循环中的参数数量?
【发布时间】:2021-11-24 11:10:31
【问题描述】:

我是 bash 编程的新手,我正在尝试实现一个迭代参数数量的 for 循环。我尝试使用“$#”或只是“for i”,但没有成功。所以,基本上,我正在寻求指导和解决这个问题的方法。这是我执行脚本的时候:

./cat.sh food.sh house.sh tv.sh

在我的脚本中:

#!/bin/bash
for i in $@
do
echo $i
done

我要回声

1
2
3

而不是

food.sh
house.sh
tv.sh

【问题讨论】:

    标签: bash for-loop sh


    【解决方案1】:

    由于问题被标记为 sh,因此这是一个符合 POSIX 的解决方案(当您无法假设存在 seq 或 C 样式的 for 循环时):

    i=1
    while [ "$i" -le "$#" ]; do
        printf '%s\n' "$i"
        i=$((i+1))
    done
    

    【讨论】:

      【解决方案2】:

      在 for 循环之外保留一个正在运行的计数器以迭代参数的数量。

      这应该可行:

      #!/bin/bash
      
      counter=0
      
      for i in "$@"
      do
      counter=$((counter+1))
      echo $counter
      done
      

      输入:

      ./cat.sh food.sh house.sh tv.sh

      输出:

      1
      2
      3
      

      输入:

      ./cat.sh a b c d e f g

      输出:

      1
      2
      3
      4
      5
      6
      7
      

      【讨论】:

        【解决方案3】:

        假设 seq 二进制文件可用并且只考虑最终目标,可以编写类似这样的内容。

        #!/bin/bash
         
        seq $#
        

        我个人不会选择这个解决方案,除非我喜欢打代码高尔夫并且宁愿坚持已经发布的纯 bash 解决方案。

        【讨论】:

          【解决方案4】:

          $# 包含参数的数量,因此 OP 可以使用一个想法来编写 for 循环:

          for ((i=1; i<=$#; i++))
          do
              echo $i
          done
          
          # or
          
          count=$#
          
          for ((i=1; i<=count; i++))
          do
              echo $i
          done
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-23
            • 2013-12-14
            相关资源
            最近更新 更多