在 Bash 中遍历命令行参数

jes*_*516 4 bash

有人可以解释这两个代码块之间的区别吗?我认为 Block #2 会输出与 Block #1 相同的输出,但事实并非如此。有人可以解释为什么吗?

# ./arguments.sh hello my name is X
Run Code Online (Sandbox Code Playgroud)

第 1 块

for i
do
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

输出:

hello
my
name
is
X
Run Code Online (Sandbox Code Playgroud)

块 #2

args=$#
for (( i=1; i<=$args; i+=1 ))
do
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

roa*_*ima 6

第一个块(隐式)遍历命令行参数 "$@"

for i in "$@"    # same as your "for i"
do
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

第二个块显式迭代参数的数量,打印索引:

args=$#                          # number of command line args
for (( i=1; i<=$args; i+=1 ))    # loop from 1 to N (where N is number of args)
do
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

鉴于,根据您的示例,$#是 5,那么$i变量将采用值1, 2, 3, 4, 5

正如在另一个(现已删除)答案中指出的那样,您可以通过索引引用命令行参数,如下所示:

args=$#
for (( i=1; i<=$args; i++ ))
do
    echo "$i - ${!i}"
done
Run Code Online (Sandbox Code Playgroud)