Bash如何在不使用循环的情况下打印出所有输入参数

时间:2015-02-07 00:41:16

标签: bash shell

我听说过bash中的循环是高效而复杂的。所以我试着制作一个脚本,以不使用任何循环打印出特定格式的所有参数。

当我做的时候

bash script_name arg1 arg2 arg3...

./script_name arg1 arg2 arg3...

它应输出:

0: script_name
1: arg1
2: arg2
...

我尝试使用$ @但问题是它从不打印出脚本名称,而且我很难想出一种打印索引的方法。

任何人都可以给我一个暗示吗?谢谢

1 个答案:

答案 0 :(得分:1)

首先,$@不包含脚本名称,它只包含实际的命令行参数。您必须明确打印$0以打印脚本名称。

以下是两个解决方案:

exec paste -d: <(seq 0 $#;) <(printf ' %s\n' "$0" "$@";);

上面运行paste实用程序将(0)从0到由seq实用程序生成的参数数量,以及(2)脚本名称和命令行参数,由printf打印,每行一个。 seqprintf命令中的每一个都在进程替换构造中运行,每个生成的设备文件表示命令输出(例如,我系统上的/dev/fd/63)传递给paste

exec printf '%s\n' "$0" "$@"| awk '{ print(i++": "$0); };';

上面打印脚本名称和命令行参数,每行一个,并将它们管道到awk,这会添加所需的编号前缀。

应该注意的是,这两种解决方案中的每一种都涉及启动至少一个额外的系统过程,用于过程替换或用于管道。这几乎可以保证比运行bash内置for循环更加更多效率低,这不需要额外的进程(假设你只调用循环中的内置函数,例如{{ 1}})。通常,内置命令/关键字/构造几乎总是比运行外部可执行文件更快。