백업을 자동화하기 위해 첫 번째 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)
NAME
NAME
따라서 수정된 스크립트는 다음과 같습니다.
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을 사용하여 스크립트를 확인할 수 있습니다.