이 예에서처럼 정의된 변수에 함수 매개변수를 "주입"하는 방법은 무엇입니까?
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
이를 방지하기 위해 선행 백슬래시를 사용할 수 있음).$
`
e
or 와 같은 위험을 피하는 또 다른 방법 은 s 를 eval
사용하는 것입니다 . 여기서 대체할 항목을 정확하게 지정할 수 있습니다.gettext
envsubst
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
순서를 반대로 할 수 있습니다. 다른 구현에서는 다음 트릭을 사용할 수 있습니다.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
(너비가 0으로 잘린 문자열)을 사용하여 다른 순서로 사용하고 싶지 않은 매개변수를 삭제합니다.