변수 이름과 해당 값을 표시하는 함수 만들기

변수 이름과 해당 값을 표시하는 함수 만들기

변수 이름을 입력으로 사용하는 함수를 작성하고 싶습니다(superEcho라고 부르겠습니다). 함수는 변수의 이름과 그 값을 인쇄해야 합니다.

function superEcho
{
     echo "$1: ?????"
}

var=100

superEcho var

이 스크립트가 반환되기를 원합니다.

var: 100

그런데 superEcho 함수에서 "???" 대신 무엇을 사용해야 할지 모르겠습니다.

답변1

POSIX적으로:

superEcho() {
  eval 'printf "%s\n" "$1: ${'"$1"'}"'
}

bash-spec 과 마찬가지로 삭제된 것으로 ${!var}예상되며 유효한 변수 이름이 포함되어 있습니다. $1그렇지 않으면 임의의 명령 주입 취약점이 됩니다.

함수에서 정리를 수행할 수 있습니다.

superEcho() {
  case $1 in
    ("" | *[!_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]* | [0123456789]*)
      printf >&2 'Invalid variable name: "%s"\n' "$1"
      return 1;;
    (*) eval 'printf "%s\n" "$1: ${'"$1"'}"'
  esac
}

유형 변수의 경우대량으로또는연관 배열, in bash또는 ksh(POSIX sh에는 배열이 없지만 "$@"함수 자체의 매개변수이므로 여기서는 사용할 수 없습니다. superEcho) 인덱스 요소의 값만 인쇄 0하지만 in에서는 zsh다음이 출력됩니다.가치의 첫 번째 문자 $IFS(및 의 SPC 문자 yash)입니다.

ksh, 또는 zsh( 배열 bashyash지원하는 4개의 Bourne 유사 쉘). typeset -p var변수 정의 및 속성 인쇄 도 참조하세요 .

답변2

사용 ${!variablename}:

function superEcho
{
    printf '%s: %s\n' "$1" "${!1}"
}

답변3

나는 다른 방법으로 한다. 나는 종종 이메일, 로그 또는 플래그(디스크에 기록됨)에 변수 이름을 사용하여 한 장치에 속하는 모든 것이 같은 방식으로 이름이 지정되도록 하고 싶습니다. 즉, 변수 이름을 기본으로 사용합니다.

RPiZero=10

ReadRPiTemp ()
{
    eval ReadSegment='$'$1
    echo "variable content: $ReadSegment"
    echo "variable name: $1"
}

ReadRPiTemp RPiZero
# NOT ReadRPiTemp "$RPiZero"

위의 내용은 sh와 bash에서 작동합니다. 직장에서 sh 호환성이 필요하기 때문에 Bash에서 동일한 작업을 수행하는 올바른 방법을 간과했습니다.

RPiZero=10

ReadRPiTemp ()
{
    declare -n ReadSegment=$1
    echo "variable content: $ReadSegment"
    echo "variable name: $1"
}

ReadRPiTemp RPiZero
# NOT ReadRPiTemp "$RPiZero"

위의 두 가지 모두 동일한 결과를 인쇄합니다.

variable content: 10
variable name: RPiZero

관련 정보