읽기 내에서 변수를 확장하는 방법은 무엇입니까?

가변 확장기

Bash 5.0.17 (1)을 사용하는 원격 CentOS에서 SSH를 통해 내가 실행 한 유일한 사용자 인 경우 read web_application_root:

$HOME/www

또는 다음과 함께 :

${HOME}/www

또는 다음과 함께 :

"${HOME}"/www

또는 다음과 함께 :

"${HOME}/www"

.NET과 같은 확장 된 (환경) 변수를 사용하여 출력을 얻는 것을 목표로합니다 MY_USER_HOME_DIRECTORY/www.

ls -la $HOME/www잘 작동 하지만 ls -la $web_application_root모든 예제 에서 실패합니다. 오류 예는 다음과 같습니다.

ls: cannot access '$HOME/www': No such file or directory

나는 read위의 모든 $HOME변형을 (오류의 작은 따옴표로 인해) 문자열로 취급 하므로 확장하지 않는다는 것을 이해합니다.

읽기 내에서 변수를 확장하는 방법은 무엇입니까?

스테판 샤젤 라스

당신이 확장합니다 $VARs 또는 ${VAR}S VAR(이름이 시작하는 ASCII 문자 또는 밑줄 및 다음 ASCII의 alnums 또는 밑줄으로 제한) 기존 환경 변수의 이름을 의미하고 (다른 모든 단어 확장을 떠나 $non_exported_shell_variable, $1, $#, ${HOME+x}, $((1 + 1)), $(cmd)...)의 손길이 닿지 않은, 당신은 사용할 수 있습니다 envsubst(GNU에서 gettext) :

IFS= read -r web_application_root || exit
web_application_root=$(printf %s "$web_application_root" | envsubst)
ls -la -- "$web_application_root"

변수 이름을 인수로 사용하고 읽기 및 환경 변수 확장을 모두 수행하는 쉘 함수로 만들 수 있습니다.

read_one_line_and_expand_envvars() {
  IFS= read -r "$1"
  ret="$?"
  command eval "$1"'=$(printf %s "${'"$1"'}" | envsubst)' && return "$ret"
}

예를 들어 다음과 같이 사용됩니다.

printf >&2 'Please enter the root dir (${ENVVAR} expanded): '
read_one_line_and_expand_envvars web_application_root || exit
printf >&2 'The expanded version of your input is "%s"\n' "$web_application_root"

제한된 환경 변수 세트로 대체를 제한하려면 목록을 $VAR1$VAR2...리터럴 인수로 envsubst다음 과 같이 전달합니다 .

web_application_root=$(
  printf %s "$web_application_root" |
    envsubst '$HOME$MYENVVAR'
)

(여기 알려줍니다 envsubst만 대신에 $HOME, ${HOME}, $MYENVVAR그리고 ${MYENVVAR}다른 모든 떠나, 입력에서 $VAR의 손길이 닿지 않은들).

모든 형태의 단어 확장 ¹을 허용하려는 경우 (그러나 명령 삽입 취약점이됩니다) 다음을 수행 할 수 있습니다.

web_application_root=$(eval "cat << __EOF__
$web_application_root
__EOF__")

또는 변수 이름을 인수로 사용하는 함수로 :

read_one_line_and_perform_shell_word_expansions() {
  IFS= read -r "$1"
  ret=$?
  command eval '
    case "${'"$1"'}" in
      (EOF) ;;
      (*)
        '"$1"'=$(command eval "cat << EOF
${'"$1"'}
EOF")
    esac' && return "$ret"
}
printf >&2 'Please enter the root dir ($var/$((...))/$(cmd) allowed): '
read_one_line_and_perform_shell_word_expansions web_application_root || exit
printf >&2 'The expanded version of your input is "%s"\n' "$web_application_root"

자세한 인라인 문서와 동일한 기능 :

read_one_line_and_perform_shell_word_expansions() {
  # first argument of our function is the variable name or REPLY
  # if not specified.
  varname=${1-REPLY}

  # read one line from stdin with read's unwanted default post-processing
  # (which is otherwise dependant on the current value of $IFS) disabled.
  IFS= read -r "$varname"

  # record read's exit status. If it's non zero, a full line could not be
  # read. We may still want to perform the expansions in whatever much
  # was read, and pass that exit status to the caller so they decide what
  # to do with it.
  ret=$?

  # We prefix the "eval" special builtin with "command" to make it lose
  # its "special" status (namely here, exit the script about failure,
  # something bash only does when in standard mode).
  command eval '
    # the approach we take to expand word expansions would be defeated
    # if the user entered "EOF" which is the delimiter we chose for our
    # here-document, so we need to handle it as a special case:
    case "${'"$varname"'}" in
      (EOF) ;;
      (*)
        # the idea here is to have the shell evaluate the
        # myvar=$(command eval "cat << EOF
        # ${myvar}
        # EOF")
        #
        # shell code when $1 is myvar, so that the
        #
        # cat << EOF
        # contents of $myvar with $(cmd), $ENV and all
        # EOF
        #
        # shell code be evaluated, and those $(cmd), $ENV expansions
        # performed in the process
        '"$varname"'=$(command eval "cat << EOF
${'"$varname"'}
EOF")
    esac' &&
      # unless eval itself failed, return read's exit status to the caller:
      return "$ret"
}

그러나 당신의 문제는 XY 문제처럼 들립니다. 입력을받는 read것은 번거롭고 비현실적입니다. 이 인수를 통해 입력을 얻기 위해 더 나은, 그리고 당신은으로 확장 할 호출자의 쉘에 둘 수 있습니다 그들이 그것을 계획입니다.

대신에

#! /bin/sh -
IFS= read -r var
ls -l -- "$var"

(그리고 기억 호출 read없이 IFS=및없이하는 것은 -r거의 절대 당신이 원하는 없습니다 ).

그것을 만드십시오 :

#! /bin/sh -
var=${1?}
ls -l -- "$var"

그리고 호출을 수행 할 수 있습니다 your-script ~/dir하거나 your-script "$HOME/dir"또는 your-script '$$$weird***/dir'심지어 your-script $'/dir\nwith\nnewline\ncharacters'그들이 맞는 볼.


¹ 이 문맥에서 단어 확장매개 변수 확장 , 산술 확장명령 대체를 의미 합니다. 여기에는 파일 이름 생성 (일명 globbing 또는 경로 이름 확장 ), 물결표 확장 또는 중괄호 확장 (그 자체는 표준 sh기능이 아님)이 포함 되지 않습니다 . here-document를 사용하면 '"s가 그대로 유지되지만 여전히 백 슬래시 처리가 있음을 유의하십시오.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

읽기 내에서 변수를 확장하는 방법은 무엇입니까?

분류에서Dev

Makefile : 쉘 기능에서 변수를 올바르게 확장하는 방법은 무엇입니까?

분류에서Dev

추가 기능 코드에서 Visual Studio 변수를 확장하는 방법은 무엇입니까?

분류에서Dev

변수에 저장된 jQuery 선택기를 확장하는 방법은 무엇입니까?

분류에서Dev

모든 열에서보기를 확장하는 방법은 무엇입니까?

분류에서Dev

MapReduce에서 감속기를 확장하는 정적 내부 클래스의 정적 변수에 액세스하는 방법은 무엇입니까?

분류에서Dev

JSP에서 <c : choose> 작업을 수행하기 전에 변수를 읽는 방법은 무엇입니까?

분류에서Dev

Swift, 내 GameScene의 확장 기능에있는 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

작은 따옴표 내에서 변수를 확장하는 방법은 무엇입니까?

분류에서Dev

bash에서 읽기 전용 변수를 삭제하는 방법은 무엇입니까?

분류에서Dev

읽기 명령으로 입력에 여러 변수를 사용하는 방법은 무엇입니까?

분류에서Dev

Javascript에서 비동기 함수 내부에 전역 변수를 할당하는 방법은 무엇입니까?

분류에서Dev

힘내 후크. 사용자 입력에서 변수를 읽는 방법은 무엇입니까?

분류에서Dev

코드 내에서 awk 변수를 확장하는 방법은 무엇입니까?

분류에서Dev

클래스 내에서 함수 기본 매개 변수를 설정하는 방법은 무엇입니까?

분류에서Dev

비동기 함수 내부와 외부에서 변수를 공유하는 방법은 무엇입니까?

분류에서Dev

PowerApp에서 환경 변수를 읽는 방법은 무엇입니까?

분류에서Dev

비동기 함수에서 확장 약속 인스턴스를 반환하는 방법은 무엇입니까?

분류에서Dev

iOS에서 수평 확장보기를 달성하는 방법은 무엇입니까?

분류에서Dev

목록 내에서 빼기를 수행하는 방법은 무엇입니까?

분류에서Dev

vue-quill 편집기에서 여러 매개 변수를 내보내는 방법은 무엇입니까?

분류에서Dev

벨로에 이미지처럼 정확히 읽기를 수행하는 방법은 무엇입니까?

분류에서Dev

잘라 내기없이 PROLOG에서 래핑 된 변수를 패턴 화하는 방법은 무엇입니까?

분류에서Dev

PHP에서 함수의 매개 변수를 읽는 가장 좋은 방법은 무엇입니까?

분류에서Dev

PHP에서 함수의 매개 변수를 읽는 가장 좋은 방법은 무엇입니까?

분류에서Dev

변수를 저장하고 나중에 계산기에서 사용하는 방법은 무엇입니까?

분류에서Dev

설치 내에서 freebsd 문서를 읽는 방법은 무엇입니까?

분류에서Dev

MVC보기에서 js의 metod에 3 개의 매개 변수를 보내는 방법은 무엇입니까?

분류에서Dev

명령에서 변수를 저장하고 확장하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    읽기 내에서 변수를 확장하는 방법은 무엇입니까?

  2. 2

    Makefile : 쉘 기능에서 변수를 올바르게 확장하는 방법은 무엇입니까?

  3. 3

    추가 기능 코드에서 Visual Studio 변수를 확장하는 방법은 무엇입니까?

  4. 4

    변수에 저장된 jQuery 선택기를 확장하는 방법은 무엇입니까?

  5. 5

    모든 열에서보기를 확장하는 방법은 무엇입니까?

  6. 6

    MapReduce에서 감속기를 확장하는 정적 내부 클래스의 정적 변수에 액세스하는 방법은 무엇입니까?

  7. 7

    JSP에서 <c : choose> 작업을 수행하기 전에 변수를 읽는 방법은 무엇입니까?

  8. 8

    Swift, 내 GameScene의 확장 기능에있는 함수를 호출하는 방법은 무엇입니까?

  9. 9

    작은 따옴표 내에서 변수를 확장하는 방법은 무엇입니까?

  10. 10

    bash에서 읽기 전용 변수를 삭제하는 방법은 무엇입니까?

  11. 11

    읽기 명령으로 입력에 여러 변수를 사용하는 방법은 무엇입니까?

  12. 12

    Javascript에서 비동기 함수 내부에 전역 변수를 할당하는 방법은 무엇입니까?

  13. 13

    힘내 후크. 사용자 입력에서 변수를 읽는 방법은 무엇입니까?

  14. 14

    코드 내에서 awk 변수를 확장하는 방법은 무엇입니까?

  15. 15

    클래스 내에서 함수 기본 매개 변수를 설정하는 방법은 무엇입니까?

  16. 16

    비동기 함수 내부와 외부에서 변수를 공유하는 방법은 무엇입니까?

  17. 17

    PowerApp에서 환경 변수를 읽는 방법은 무엇입니까?

  18. 18

    비동기 함수에서 확장 약속 인스턴스를 반환하는 방법은 무엇입니까?

  19. 19

    iOS에서 수평 확장보기를 달성하는 방법은 무엇입니까?

  20. 20

    목록 내에서 빼기를 수행하는 방법은 무엇입니까?

  21. 21

    vue-quill 편집기에서 여러 매개 변수를 내보내는 방법은 무엇입니까?

  22. 22

    벨로에 이미지처럼 정확히 읽기를 수행하는 방법은 무엇입니까?

  23. 23

    잘라 내기없이 PROLOG에서 래핑 된 변수를 패턴 화하는 방법은 무엇입니까?

  24. 24

    PHP에서 함수의 매개 변수를 읽는 가장 좋은 방법은 무엇입니까?

  25. 25

    PHP에서 함수의 매개 변수를 읽는 가장 좋은 방법은 무엇입니까?

  26. 26

    변수를 저장하고 나중에 계산기에서 사용하는 방법은 무엇입니까?

  27. 27

    설치 내에서 freebsd 문서를 읽는 방법은 무엇입니까?

  28. 28

    MVC보기에서 js의 metod에 3 개의 매개 변수를 보내는 방법은 무엇입니까?

  29. 29

    명령에서 변수를 저장하고 확장하는 방법은 무엇입니까?

뜨겁다태그

보관