在for循环中打印出参数值

在for循环中打印出参数值

这是脚本

user@linux:~$ cat script.sh 
#!/bin/bash
for i in `seq $#`
do
  echo $i
done
user@linux:~$ 

输出

user@linux:~$ ./script.sh a b c
1
2
3
user@linux:~$ 

所需输出

我想得到这样的参数值......而不仅仅是数字

user@linux:~$ ./script.sh a b c
1 - a
2 - b
3 - c
user@linux:~$ 

答案1

#! /bin/sh -
i=1
for arg do
  printf '%2d: %s\n' "$i" "$arg"
  i=$((i + 1))
done

也就是说,不是循环索引,而是循环参数并单独增加索引。

关于您的方法的一些注意事项:

  • 在列表上下文中保留未加引号的参数扩展具有非常特殊的含义,你几乎不想那样做

  • echo不能用于输出任意数据

  • `...`现在应该避免命令替换的形式。代替使用$(...)

  • 由于不带引号的命令替换也会调用 split+glob,因此必须小心使用。在这里,您正在使用分裂部分,这意味着您依赖于 的当前值$IFS。的输出seq不包含通配符,因此您不会遇到问题全局部分。

  • seq不是标准命令,并非在所有系统上都可以找到。要循环数字,无论如何它都不是最好的方法,因为这意味着将整个输出存储在内存中并将其拆分(导致内存中产生额外的副本),这意味着即使 shell 内置了在单独的进程中运行单独的实用程序对此表示支持。

  • 如果您不放置任何 she-bang(#! /path/to/interpreter -第一行),则您得到的唯一保证是它将由 POSIX shell 解释sh(在旧系统中,甚至可能是 Bourne(非 POSIX)shell ),因此您需要确保您使用的语法符合 POSIX 标准。即使在sh由 提供的系统上,运行时也bash并非所有扩展都被启用。bashsh

    上面的代码符合 POSIX 标准(并且也可以在 .NET 中工作bash),但不兼容 Bourne(因为$((...))算术扩展语法在 Bourne shell 中不可用)。在 Solaris 10 及更早版本上,您需要将 she-bang 更改为 以#! /usr/xpg4/bin/sh -获得(大部分)兼容 POSIX 的解释器

答案2

#!/bin/bash
for ((i=1; i<=$#; i++))
do
  echo "$i - ${!i}"
done

相关内容