这是脚本
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
也就是说,不是循环索引,而是循环参数并单独增加索引。
关于您的方法的一些注意事项:
在列表上下文中保留未加引号的参数扩展具有非常特殊的含义,你几乎不想那样做。
`...`
现在应该避免命令替换的形式。代替使用$(...)
。由于不带引号的命令替换也会调用 split+glob,因此必须小心使用。在这里,您正在使用分裂部分,这意味着您依赖于 的当前值
$IFS
。的输出seq
不包含通配符,因此您不会遇到问题全局部分。seq
不是标准命令,并非在所有系统上都可以找到。要循环数字,无论如何它都不是最好的方法,因为这意味着将整个输出存储在内存中并将其拆分(导致内存中产生额外的副本),这意味着即使 shell 内置了在单独的进程中运行单独的实用程序对此表示支持。如果您不放置任何 she-bang(
#! /path/to/interpreter -
第一行),则您得到的唯一保证是它将由 POSIX shell 解释sh
(在旧系统中,甚至可能是 Bourne(非 POSIX)shell ),因此您需要确保您使用的语法符合 POSIX 标准。即使在sh
由 提供的系统上,运行时也bash
并非所有扩展都被启用。bash
sh
上面的代码符合 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