Intereting Posts
Запуск X-клиентов через мульти-хост ssh-туннель Как запустить файл Phantombot Jar в Linux Mint 19 Tara? Awk – строка печати, если номер находится между столбцом 1 и столбцом 2 Как я могу переключить поведение прокрутки мыши, пока экран уже запущен? В чем смысл `shared` memory в команде` free` shell? Окно хотело бы, чтобы X-представляет одновременно в двух фреймовых буферах Инструмент для сравнения файлов на одном диске с информацией о реестре на другом? unison -addversionno Полученный неожиданный заголовок с сервера Избегайте «Ошибка манипулирования токенами аутентификации» при смене пароля Как добавить к переменной среды с помощью файла .env? Centos 6 застрял при загрузке заставки после успешной установки Две папки, разделяющие один том. Что это значит? Недокументированная –read-environment в ifup / ifdown / ifquery Weird X11 поведение после возобновления приостановления Переадресация командного вывода с помощью супервизора

Передать аргумент функции в определенную переменную

Как я могу «ввести» аргумент функции в определенную переменную, как в этом примере?

mood="i am $1 happy" happy () { echo "$mood" } happy "very" 

Токовый выход:

 i am happy 

Желаемый вывод:

 i am very happy 

Спасибо!

Редактировать :

Пример из реальной жизни: у меня много переводимых строк в другом файле, например:

 installing="Installing" installation_started="The installation of  started at " installation_ended="The installation of  ended at " 

И функция:

 apt_get_install () { echo "$installing $1..." echo "$installation_started" apt-get -y install "$1" echo "$installation_ended" } apt_get_install  

И тогда я хочу ввести в вывод.

    Это должно работать. Будьте очень осторожны с eval , никогда не используйте eval при вводе пользователем, он выполнит все что угодно.

     mood='i am $1 happy' happy () { eval echo "$mood" } happy "very" 

    Вы, кажется, хотите предоставлять информационные сообщения пользователю на разных языках. Возможно, вам следует использовать программное обеспечение, специально разработанное для этой цели, если вы хотите сделать это правильно. В мире GNU есть gettext который может быть вам полезен. (Это не тривиальная проблема для решения!)

    В приведенном ниже тексте рассматривается вопрос до его обновления и часть обновленного вопроса (до того, как я заметил, что речь идет о предоставлении переведенных сообщений):


    Ваш пример не имеет особого смысла, так как ваша функция – это просто псевдоним echo . Вы можете легко назвать свою happy функцию как

     happy "I am $adjective happy" # $adjective would be the string "very" 

    Кроме того, похоже, что стандартная функция printf также может быть полезна для ознакомления:

     adjective='very' printf 'I am %s happy\n' "$adjective" 

    printf принимает один или несколько аргументов, где первый – это статическая строка, описывающая формат вывода, возможно, содержащий заполнители, а на остальные аргументы ссылаются заполнители.


    Если сообщения являются строками статического формата, просто используйте printf :

     apt_get_install () { printf 'Installing %s...\n' "$1" printf '%s installation started at %s\n' "$1" "$(date)" apt-get -y install "$1" printf '%s installation ended at %s\n' "$1" "$(date)" } apt_get_install thing 

    Связанные с:

    • Почему printf лучше, чем echo?

    Попробуйте приведенный ниже код,

     function happy () { mood="i am $1 happy" echo "$mood" } happy "very" 

    Или попробуйте ниже,

     function happy () { echo "i am $1 happy" } happy "very" 

    С zsh :

     mood='I am $1 happy' happy () { printf '%s\n' ${(e)mood} } happy very 

    Флаги раскрытия параметров e приводят к тому, что все расширения параметров, арифметические расширения и подстановки команд оцениваются в содержимом переменной (для их предотвращения можно использовать обратную косую черту перед $ или ` ).

    Другой подход, который позволяет избежать опасных вещей, таких как e или eval заключается в использовании envsubst gettext , где вы можете указать, что именно вы хотите заменить:

     mood='I am $HOWMUCH happy' happy() { HOWMUCH=$1 envsubst <<< "$mood" } happy very 

    Хотя <<< также является расширением zsh, теперь оно поддерживается несколькими другими shellми, включая bash .

    Замените envsubst на envsubst '$HOWMUCH' если вы хотите убедиться, что $HOWMUCH только $HOWMUCH (или ${HOWMOUCH} ).

    С ksh93 или zsh вы также можете использовать:

     mood='I am %1$s happy\n' happy() { printf "$mood" "$@" } 

    В других реализациях printf которые не поддерживают %1$s чтобы указать, какой аргумент использовать, в этом конкретном случае вы можете использовать %s . Если формат имеет %s %s , первый %s получает первый аргумент, второй - второй аргумент. Вы можете использовать %2$s %1$s чтобы изменить порядок с помощью ksh93 или zsh . В других реализациях вы можете использовать этот трюк вместо этого:

     case $(locale language) in (*English*) msg="I am in a %s %s%.0s%.0s\n"; mood=mood;; (*French*) msg="Je suis d'une %.0s%s %s%.0s\n"; mood=humeur;; esac mood() { printf "$msg" "$@" "$@" } mood formidable "$mood" 

    Что означало бы, I'm in a formidable mood для англоязычного пользователя, а Je suis d'une humeur formidable - для франкоязычного пользователя. Мы дважды передаем аргументы и используем %.0s (строка, обрезанная до нулевой ширины), чтобы отбросить те, которые мы не хотим использовать в качестве аргументов в разных порядках.