我听说过bash中的循环是高效而复杂的。所以我试着制作一个脚本,以不使用任何循环打印出特定格式的所有参数。
当我做的时候
bash script_name arg1 arg2 arg3...
或
./script_name arg1 arg2 arg3...
它应输出:
0: script_name
1: arg1
2: arg2
...
我尝试使用$ @但问题是它从不打印出脚本名称,而且我很难想出一种打印索引的方法。
任何人都可以给我一个暗示吗?谢谢答案 0 :(得分:1)
首先,$@
不包含脚本名称,它只包含实际的命令行参数。您必须明确打印$0
以打印脚本名称。
以下是两个解决方案:
exec paste -d: <(seq 0 $#;) <(printf ' %s\n' "$0" "$@";);
上面运行paste
实用程序将(0)从0到由seq
实用程序生成的参数数量,以及(2)脚本名称和命令行参数,由printf
打印,每行一个。 seq
和printf
命令中的每一个都在进程替换构造中运行,每个生成的设备文件表示命令输出(例如,我系统上的/dev/fd/63
)传递给paste
exec printf '%s\n' "$0" "$@"| awk '{ print(i++": "$0); };';
上面打印脚本名称和命令行参数,每行一个,并将它们管道到awk
,这会添加所需的编号前缀。
应该注意的是,这两种解决方案中的每一种都涉及启动至少一个额外的系统过程,用于过程替换或用于管道。这几乎可以保证比运行bash内置for循环更加更多效率低,这不需要额外的进程(假设你只调用循环中的内置函数,例如{{ 1}})。通常,内置命令/关键字/构造几乎总是比运行外部可执行文件更快。