함수 내부에 변수 정의

함수 내부에 변수 정의

이 인터넷 어딘가에서 읽은 후 명령 출력을 변수로 사용할 때 다음을 수행하는 것이 가장 좋다는 것을 알았습니다.

FILE_CORE_NAME="$(/usr/bin/env basename $(/usr/bin/env awk -F "." '{print $1}' <<< "${FILE_TO_PROCESS}"))"; local FILE_CORE_NAME;

그러나 이 구성을 사용하면 FILE_CORE_NAME에서 파생된 값이 비어 있습니다. local FILE_CORE_NAME줄에서 후행을 제거 하면 모든 것이 예상대로 작동합니다.

제가 잘못 읽은 건가요, 아니면 잘못 읽은 건가요?

답변1

FILE_CORE_NAME="$(/usr/bin/env basename $(/usr/bin/env awk -F "." '{print $1}' <<< "${FILE_TO_PROCESS}"))"; local FILE_CORE_NAME;

가독성을 위해 몇 줄로 다시 포맷하더라도

FILE_CORE_NAME="$(
  /usr/bin/env basename $(
     /usr/bin/env awk -F "." '{print $1}' <<< "${FILE_TO_PROCESS}"
  )
)"
local FILE_CORE_NAME

많은 계정이 잘못되었습니다.

  • awk{print $1}입력의 모든 줄에서 명령을 실행하므로 $'/a.b/c\nd.e\nf/g.h.i'파일이 있는 경우 출력됩니다 /a<newline>d<newline>f/g'. 개행 문자는 모든 문자로 유효하며 파일 이름은 텍스트일 수 없으므로 줄 기반 텍스트 유틸리티를 사용하여 처리하면 안 됩니다. .
  • /foo.d/file.txt위에서 언급한 것처럼 단일 줄 파일 경로의 경우에도 또는 파일이 있으면 또는 대신 /foo.bar.2020.jpg가져옵니다 . 기본 이름을 먼저 완성해야 하며, 마지막까지 검색하고 싶은 부분입니다./foo/foo.d/file/foo.bar.2020.
  • 두 번째 부분에서는 따옴표가 생략되므로 $(...)분할+글로브의 영향을 받습니다.가능한 치명적인 결과.
  • --그 이후에는 옵션 구분 기호가 누락되어 basename파일 경로가 -.
  • local함수의 지역 변수를 선언하면 됩니다. 그러나 여기서는 정의합니다.local 뒤쪽에이를 수정하여 함수 호출자의 변수를 수정합니다. 그런 다음 bash(내장 기능이 있는 ash와 반대 local) 에서 변수는 로컬로 선언되지만 locvar_inherit옵션이 활성화되지 않는 한 어떤 값도 설정하지 않습니다.local var
  • 모든 대문자 변수 이름은 환경 변수 이름으로 유지되거나 최소한 스크립트 및 종속성 전반에 걸쳐 전역 범위를 갖는 변수 이름으로 유지되어야 합니다.
  • 여기서는 그것을 사용하는 요점이 보이지 않습니다 /usr/bin/env.

여기서 해야 할 분명한 일은 zsh로 전환하고 다음을 수행하는 것입니다.

local core_name=$FILE_TO_PROCESS:t:r

70년대의 csh 또는 vim(또는 bash 기록 대체이지만 인수 확장은 아님)처럼 :t꼬리 이름과 :r루트 이름(확장자 하나가 제거됨)을 제공합니다.

을 사용해야 하는 경우 bash다음을 수행할 수 있습니다.

local core_name
core_name=$(basename -- "$FILE_TO_PROCESS") || return
core_name=${core_name%.*}

(이는 local기능이 내장된 모든 Ash와 유사한 쉘에도 적용됩니다.)

후행 줄 바꿈을 제거하는 것을 잊지 마십시오 $(...).

예를 들어 if 는 $FILE_TO_PROCESS빈 문자열이 됩니다 /home/me/.zshrc. 예를 들어 함수의 나머지 부분에서 이 값으로 수행하려는 작업에 따라 이 값뿐만 아니라 다른 특수 값 도 $core_name보호할 수 있습니다 -....$core_name

답변2

local name=value지역 변수를 생성하고 값으로 설정합니다. 귀하의 경우에는 값이 없으므로 빈 지역 변수를 생성하고 해당 지역 변수는 저장된 명령 출력과 동일한 이름을 가진 지역이 아닌 변수를 숨깁니다.

따라서 먼저 변수를 로컬로 선언한 다음 값을 할당해야 합니다.

다음 스니펫:

func() {
  x=4
  local x
  echo "func: $x"
}
x=1
func
echo "outside: $x"

그것은 인쇄한다

func:
outside: 4

관련 정보