Как добавить команду

Я не могу вспомнить, как добавить команду в сценарий оболочки. Я искал append , add , concat и многое другое без успеха. Мой google-fu сегодня не помогает.

В основном у меня есть

belly = tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) if [ -z "${NUMBER+x}" ]; then # check if NUMBER exists tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) else tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) | cat -n fi 

и он отлично работает, но мне не нравится дублирующая логика. Я знаю, что могу использовать функцию или eval, но есть ли более простой способ сделать это? У меня в голове что-то вроде этого:

 belly = tail -n +$HEAD $1 | head -n $((TAIL-HEAD+1)) if [ -z "${NUMBER+x}" ]; then # check if NUMBER exists belly else belly | cat -n fi 

Но это не сработает. Что мне не хватает?

  • Как я могу отобразить первые несколько строк файла с обновлениями?
  • Использование головы и хвоста для захвата различных наборов строк и сохранения в один файл
  • tail: незаконный вариант - ошибка -53 \ r при использовании головы и хвоста в одном файле в одном скрипте
  • будет хвост с трубопроводом читать весь файл?
  • Можно ли изменить значение COUNT по умолчанию для хвоста и головы?
  • 3 Solutions collect form web for “Как добавить команду”

    На самом деле здесь можно было бы ответить: условный трубопровод

    Этот ответ принимает оболочку if/then/else mechanic и использует ее для встраивания логики внутри конвейера. Вы можете сделать это также с помощью оператора && , но это не так чисто читать, поэтому я предпочитаю, if .

    В основном в вашем случае tail будет таким же (обратите внимание также на изменение -z на -n ):

     tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) | if [ -n "${NUMBER+x}" ]; then cat -n; else cat; fi 

    (у этого могут быть некоторые ошибки, я не очень увлекаюсь программированием на Linux, но вы понимаете).

    Один из вариантов – установить переменную для управления изменяющейся частью конвейера. Если единственной изменяющейся частью является параметр командной строки, реализация проста:

     cat_arg="" if [ -n "${NUMBER+x}" ]; then cat_arg="-n" fi somepipeline ... | cat $cat_arg 

    Хотя таким образом трудно полностью удалить последнюю часть конвейера, поэтому мы будем бесполезно использовать кошку, но это маловероятно. Кроме того, это зависит от того, чтобы не ссылаться на переменную, что делает невозможным использование пробельных или глобальных символов в изменяющихся аргументах.

    Таким образом, массив будет лучше:

     final=(cat) if [ -n "${NUMBER+x}" ]; then final=(cat -n) fi somepipeline ... | "${final[@]}" 

    Или вы можете создать две функции и вызвать одну через переменную.

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

     # define the function belly() { tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) } if ... ; then belly "$1" | this else belly "$1" | that fi 

    Вам нужно передать $1 явно, так как функции имеют свой собственный контекст позиционных параметров.

    По сути, вы хотите передать или не передать параметр -n для cat зависимости от состояния $NUMBER

    Просто сделайте это:

     tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) | cat ${NUMBER:+'-n'} 

    Мы также можем покончить с сценарием UUOC:

     eval "tail -n +\"$HEAD\" \"\$1\" | head -n \$((TAIL-HEAD+1)) ${NUMBER:+|cat -n}" 
    Linux и Unix - лучшая ОС в мире.