如何迭代for循环中的参数数量?

How to iterate the number of arguments in a for loop?

我是 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

在 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

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

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

# or

count=$#

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

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

#!/bin/bash
 
seq $#

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

由于问题被标记为 sh,这里有一个符合 POSIX 的解决方案(当您不能假设存在 seq 或 C 风格 for循环):

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