변수를 허용하는 스크립트를 가져올 수 없습니다

변수를 허용하는 스크립트를 가져올 수 없습니다

백업을 자동화하기 위해 첫 번째 bash 스크립트를 작성 중입니다. 나는 첫 번째 장애물에 거의 부딪쳤다.

변수를 사용하여 tar 아카이브의 파일 이름을 만들고 싶습니다. hostname date time.tar.bz2나는 이것을 사용하여 직접 얻을 수는 있지만 $(hostname)_$(date +"%FT%T")변수에 넣을 수는 없는 것 같습니다 .

내 "테스트 스크립트"는 다음과 같습니다.

#! /bin/bash


NAME=$($(hostname)_$(date +"%FT%T"))

tar -cjvf "$(NAME).tar.bz2" testing testing2

( 테스트에 사용되는 가상 디렉터리는 어디에 있고 testing는 무엇입니까?)testing2

불행하게도 이 작업은 다음과 같습니다.

$ scripts/trial.sh
scripts/trial.sh: line 6: NAME: command not found

Thu Jun 10 23:11:06 AEST 2021

NAME나는 그 진술을 해결 방법으로 분해하려고 노력했습니다.

#! /bin/bash

## test of bits and pieces

NAME=$(hostname)_$(date +"%FT%T")
NAME_VAR=$(NAME)

Test=$(date)

echo $NAME_VAR
echo $Test

tar -cjvf "$(NAME_VAR).tar.bz2" testing testing2

터미널에서 다음을 얻었습니다.

$ scripts/trial.sh
scripts/trial.sh: line 6: NAME: command not found

Thu Jun 10 23:34:37 AEST 2021
scripts/trial.sh: line 13: NAME_VAR: command not found
testing/
testing2/

왜 이런 일이 일어나는지 이해가 되지 않습니다. 내가 무엇을 놓치고 있나요?

답변1

쉘 스크립팅을 처음 시도하는 경우 다음을 사용하는 것이 좋습니다.주택 검사"교정" 셸 스크립트는 많은 Linux 배포판에서 독립 실행형 프로그램으로도 사용할 수 있습니다.

직면하고 있는 문제에 관해: 변수 역참조를 위해 쉘과 Makefile 구문을 혼동하고 있는 것 같습니다. 셸에서는 명령을 실행하려고 시도 하고 해당 명령의 출력을 반환하는 변수의 값입니다. 이를 "명령 대체"라고 합니다( " $NAME드립 테스트" 해결 방법을 작성할 때 올바르게 사용했습니다).NAME$(NAME)NAMENAME

따라서 수정된 스크립트는 다음과 같습니다.

NAME="$(hostname)_$(date +"%FT%T")"
tar -cjvf "$NAME.tar.bz2" testing testing2

참고로

  • 모두 대문자로 된 변수 이름은 환경 변수로 셸에 내보내지 않는 한 사용하면 안 됩니다. 그렇지 않으면 중요한 환경 변수가 충돌하거나 덮어쓸 수 있습니다 $PATH.
  • 정확해야 함변수 참조 인용,특히 변수에 파일 이름이 포함된 경우. 그렇지 않으면 쉘 스크립트에서 공백, ,, *개행 문자 ?(예, 이러한 문자도 파일 이름에 나타날 수 있습니다!) 등과 같은 특수 문자가 포함된 파일 이름을 우연히 발견할 수 있습니다.

꼭 살펴보시길 권합니다

추가 읽기를 위해.

답변2

첫 번째 줄은 다음과 같아야 합니다.

NAME=$(hostname)_$(date +"%FT%T")

당신이 하는 방식은 명령 대체를 사용하고 출력을 명령으로 처리하며, 존재하지 않기 때문에 오류가 발생합니다.

마지막 줄은 다음과 같습니다.

tar -cjvf "$NAME.tar.bz2" testing testing2

나중에 참조하려면 shellcheck.net을 사용하여 스크립트를 확인할 수 있습니다.

관련 정보