정의된 변수에 함수 매개변수 전달

정의된 변수에 함수 매개변수 전달

이 예에서처럼 정의된 변수에 함수 매개변수를 "주입"하는 방법은 무엇입니까?

mood="i am $1 happy"

happy ()
{
    echo "$mood"
}

happy "very"

현재 출력:

i am  happy

원하는 출력:

i am very happy

감사해요!

편집하다:

실제 예: 다른 파일에 다음과 같이 번역 가능한 문자열이 많이 있습니다.

installing="Installing"
installation_started="The installation of <app> started at <date>"
installation_ended="The installation of <app> ended at <date>"

다음과 같은 기능도 있습니다.

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

apt_get_install <app>

<app>그런 다음 출력에 주입하고 싶습니다 .

답변1

이것은 작동합니다. 매우 조심 eval하고 사용자 입력에 사용하지 마십시오 eval. 어떤 작업이라도 수행됩니다.

mood='i am $1 happy'

happy ()
{
    eval echo "$mood"
}

happy "very"

답변2

다양한 언어로 사용자에게 정보 메시지를 제공하고 싶은 것 같습니다. 이 작업을 올바르게 수행하려면 이 목적을 위해 특별히 설계된 소프트웨어를 사용해야 할 것입니다. 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

관련된:

답변3

다음 코드를 시도해 보세요.

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

happy "very"

또는 다음 중 하나를 시도해 보세요.

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

happy "very"

답변4

그리고 zsh:

mood='I am $1 happy'

happy () {
  printf '%s\n' ${(e)mood}
}

happy very

매개변수 확장 플래그는 모든 매개변수 확장, 산술 확장 및 명령 대체가 변수 내용 내에서 평가되도록 합니다(또는 e이를 방지하기 위해 선행 백슬래시를 사용할 수 있음).$`

eor 와 같은 위험을 피하는 또 다른 방법 은 s 를 eval사용하는 것입니다 . 여기서 대체할 항목을 정확하게 지정할 수 있습니다.gettextenvsubst

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

zsh 확장이기도 하지만 <<<이제 bash.

( 또는 )만 교체되었는지 확인하려면 envsubst으로 교체하세요.envsubst '$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순서를 반대로 할 수 있습니다. 다른 구현에서는 다음 트릭을 사용할 수 있습니다.ksh93zsh

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(너비가 0으로 잘린 문자열)을 사용하여 다른 순서로 사용하고 싶지 않은 매개변수를 삭제합니다.

관련 정보