쉘 스크립트의 변수 보간

쉘 스크립트의 변수 보간

나는 pg 백업을 위해 다음 쉘 스크립트를 작성했습니다.

#!/bin/bash

PG_USER=donato
DATABASE=mydb
SERVER=216.58.219.174
DIR="$HOME/pg_bak"
DATE=$(date +"%m_%d_%y")
FILE="$DATABASE_$DATE"
ERROR_FILE="$HOME/pg_bak/error_bak/$FILE_error.txt"
# pass @ .pgpass

PG_BAK_NOW () {
  pg_dump -h $SERVER -U $PG_USER $DATABASE >$FILE 2>$ERROR_FILE
  code=$?
  if [ $code -ne 0 ]; then
    echo 1>&2 "The backup failed (exit code $code), check for errors in $ERROR_FILE"
  fi
}

echo "Ready to dump to $FILE" >> "$HOME/pg_status" 

cd $DIR
if [ -f "$FILE" ];
then
  rm $FILE
  PG_BAK_NOW 
else
  PG_BAK_NOW
fi

실행하면 잠시 동안 실행될 것이라는 것을 알고 있습니다.

$ pgrep -fl pg_bak.sh
4603 pg_bak.sh

하지만 충돌이 발생합니다.

$ ./pg_bak.sh
The backup failed (exit code 1), check for errors in /home/viggy/pg_bak/error_bak/.txt

이 부분에 주목하세요 .txt. 오류 파일의 이름 mydb_6_11_2016_error.txt은 가 아닌 이어야 합니다 .txt. bash 스크립트가 $FILE 변수와 하드코딩된 문자열 "_error"를 삽입하지 않는 이유는 무엇입니까? 덤프 파일에는 $FILE을 올바르게 삽입하지만 오류 파일에는 삽입하지 않습니다. 왜?

답변1

매우 흔한 실수입니다. 중괄호가 누락되었습니다.

ERROR_FILE="$HOME/pg_bak/error_bak/$FILE_error.txt"

다음 공식에 의해 결정됩니다.

ERROR_FILE="$HOME/pg_bak/error_bak/${FILE}_error.txt"

답변2

jlliagre가 지적했듯이 bash가 변수 이름으로 처리할 문자열 부분 주위에 중괄호를 사용해야 합니다. 그렇지 않으면 이름의 일부가 될 수 없는 문자에 도달하면 문자열을 이름으로 처리하는 것을 중지합니다.

이 경우 FILE_error변수 이름은 _변수 이름에 허용되는 대로 처리됩니다. 실제로는 해당 부분만 필요하므로 FILE해당 부분 주위에 중괄호를 넣어 명시적으로 bash에 알려주어야 합니다 ${FILE}_error.

귀하의 예에서는 설정되지 않았으므로 빈 문자열로 확장되므로 얻는 내용은 파일 이름 FILE_error과 같습니다 ..txt

관련 정보