Расширение переменной при определении функции в ZSH

Я замечаю, что вы используете ключ DSA. OpenSSH 7.0 и выше по умолчанию отключена поддержка ключей DSA. Можно проверить, вызывает ли это проблемы. См. SSH продолжает пропускать мой лобовый ключ и запрашивать пароль и https://superuser.com/q/1016989/93541 .

-121--228579-

awk 'NF==3' file

Печать строки, если число полей равно 3. Довольно просто изменить количество столбцов в соответствии с вашими данными.

Однако, как было указано, это не работает с требованием ОП о переменном количестве полей.

-121--66780-

hostname -I >> file_name 

это сделает все, что вы хотите

2
25.09.2018, 03:53
2 ответа

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

xtest(){
  typeset -g test_variable
  : ${test_variable:=$variable}
  echo $test_variable
}

Это устанавливает test_variableпри первом вызове функции, но не перезаписывает его впоследствии.

ОБНОВЛЕНИЕ :Изменен синтаксис определения функции в соответствии с комментарием, данным Stéphane Chazelas, а также переименована моя функция из test в xtest, потому что в любом случае называть функцию «тест» — плохая идея.

1
27.01.2020, 22:08

Во-первых, обратите внимание, что синтаксис определения функции в zsh, как и в оболочке Bourne,:

funcname() cmd

(хотя он также поддерживает синтаксис ksh function funcname {...}и некоторые другие ).

funне является синтаксическим ключевым словом zsh. С помощью fun foo() cmdвы определяете функции funи fooс cmdв качестве тела.

Я бы также рекомендовал не использовать testв качестве имени функции, поскольку test— это имя стандартной команды (, встроенной в zshи большинстве других Bourne -, таких как оболочки ).

Здесь, если вам нужна функция с локальной переменной с фиксированным значением, вам нужно встроить это значение в определение функции:

mytest() {
  local variable=test
  echo $variable
}

variableбудет локальным по отношению к функции, но по-прежнему видимым для других функций, вызываемых этой mytest, если таковые имеются. Если вы хотите, чтобы он был скрыт от других функций, то есть выполнять статическую область видимости, вы можете использоватьprivate(в модуле zsh/param/private)вместо local.

Если вы хотите, чтобы это фиксированное значение было значением глобальной переменной $variableво время определения mytest, вам все равно нужно встроить его в определение, что-то как:

zmodload zsh/param/private
eval '
  mytest() {
    private variable='${(qq)variable}'
    echo $variable
    otherfunction...
  }
'

Где мы вставляем содержимое переменной (, правильно цитируемой с${(qq)...})в определении.

1
27.01.2020, 22:08

Теги

Похожие вопросы