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