2015-02-07 2 views
0

Я слышал, что этот цикл в bash эффективен и сложный. поэтому я пытаюсь сделать скрипт, который распечатывает весь аргумент в определенном формате без использования какого-либо цикла.Bash как распечатать все входные аргументы без использования цикла

Когда я сделать

bash script_name arg1 arg2 arg3... 

или

./script_name arg1 arg2 arg3... 

он должен выводить:

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

Я пытаюсь использовать $ @, но проблема в том, что никогда не печатает имя сценария , и у меня возникли проблемы с возможностью распечатать индекс.

Может ли кто-нибудь рассказать мне подсказку? спасибо

+1

Вы слышали неправильно, если вы не используете компьютер 286? Любой средний современный процессор не должен иметь проблем с эффективностью при работе с данными, находящимися в памяти. 2-й, когда/почему быстрее печатать аргументы? Третий любой код, который вы пишете в оболочке, которая производит нужный вам результат, будет более сложным, сложнее для понимания и сложнее понять кто-то другой. Жизнь слишком короткая, используйте инструменты, которые ваша среда дает вам бесплатно ;-) !! Удачи. – shellter

ответ

1

Во-первых, [email protected] не содержит имя сценария, он содержит только фактические аргументы командной строки. Вы должны напечатать $0 явно, чтобы напечатать имя сценария.

Вот два решения:

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

выше запускает утилиту paste склеить (1) последовательность чисел от 0 до количества аргументов, приведенных, формируемого утилитой seq, и (2) имя сценария и аргументы командной строки, напечатанные printf, по одному в каждой строке. Каждая из команд seq и printf запускается в конструкции замещения процесса, причем каждый сгенерированный файл устройства, представляющий вывод команды (например, /dev/fd/63 в моей системе), передается в paste.

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

Вышеприведенные печатает имя сценария и аргументы командной строки, одна в каждой строке, и трубы их к awk, который добавляет нужный префикс нумерации.

Следует отметить, что каждое из этих двух решений включает запуск по меньшей мере одного дополнительного системного процесса либо для замещения процесса, либо для трубопровода. Это в значительной степени гарантировано, что будет намного больше неэффективно, чем запуск встроенного for-loop bash, который не требует дополнительных процессов (при условии, что вы вызываете только встроенный материал внутри цикла, например printf). В общем, встроенные команды/keywords/constructs почти всегда будут быстрее, чем запуск внешних исполняемых файлов.

+0

Как именно 'exec printf' улучшает' printf' в этом случае? 'printf' является встроенным, и' bash' всегда будет порождать подпроцесс для канала. – rici

+0

Я полагаю, что это моя привычка всегда использовать 'exec', когда я выполняю гарантированную окончательную команду в скрипте, код возврата которого я хочу вернуть из скрипта. По крайней мере, это своего рода документация для всех, кто просматривает код, который явно является окончательной командой сценария. В общем, это также освобождает программиста от необходимости определять, когда окончательная команда действительно встроена во все версии оболочки, над которыми может работать скрипт.Наконец, хотя я не знаю много о внутренних оболочках оболочки, меня не удивило бы, если бы она сделала возможной оптимизацию. – bgoldst

+0

'bash' будет делать эту оптимизацию без какой-либо помощи; это его ограниченная форма ТШО. 'zsh' более агрессивно выполняет TCO. FWIW. (И я лично считаю '' достаточно самодокументированным, но это только я. Мне было просто любопытно. – rici

Смежные вопросы