К сожалению, это непросто решить портативным способом. Стандартная техника выглядит так (замените /usr/bin/awk
на путь awk):
#!/usr/bin/awk -f
BEGIN { if (!len) len = 1; end = start + len }
{ for (i = start; i < end; i++) { print $1 } }
Жестко запрограммированный путь awk
и нестандартный флаг -f
делают его не переносимым на все *nix. Если вы собираетесь запускать свой скрипт только на одной машине, это может сработать. Однако, чтобы сделать переносимый скрипт awk
, вам нужно будет обернуть его в скрипт оболочки. Вот два способа сделать это в одном файле:
Первый способ стандартный и легко читаемый:
#!/bin/sh
awk '
BEGIN { if (!len) len = 1; end = start + len }
{ for (i = start; i < end; i++) { print $1 } }
' "$@"
К сожалению, это не удается по двум ключевым причинам:
- Если ваш awk-скрипт содержит символ
'
, вам нужно будет ввести его следующим образом: '"'"'
, чтобы «экранировать» его.
- Если вы используете текстовый редактор с подсветкой синтаксиса, вы не сможете правильно выделить свой awk-скрипт.
Другое решение — использовать sed
для удаления оболочки sh
:
#!/bin/sh
exec awk "$(sed '1,2d' "$0")" "$@"
BEGIN { if (!len) len = 1; end = start + len }
{ for (i = start; i < end; i++) { print $1 } }
Это что-то вроде двухстрочного заголовка шабанга. Он вызывает awk, используя файл из строки 3 ниже в качестве аргумента скрипта. Это позволяет вам сохранить вашу красивую подсветку синтаксиса, и вы по-прежнему можете использовать '
символов в свое удовольствие. Я вижу два минуса:
- Возможно, это не интуитивно понятно для чтения.
- Если вы используете линтер кода, это может не понравиться.
person
Sudo Bash
schedule
13.12.2019